Rust基本语法

Rust基本语法

Hello World

fn main() {println!("Hello, world!");
}

Rust数据类型

Rust 是一种静态类型的语言。 Rust 中的每个值都是某种数据类型。 编译器可以根据分配给它的值自动推断变量的数据类型。

声明变量

使用关键词 let 声明变量。

直接赋值的场合Rust会自动的推断变量类型,在ide可以很方便的查看

Image1

fn main() {let company_string = "TutorialsPoint";  // string 类型let rating_float = 4.5;                 // float 类型let is_growing_boolean = true;          // boolean 类型let icon_char = '♥';                    //unicode character 类型println!("company name is:{}",company_string);println!("company rating on 5 is:{}",rating_float);println!("company is growing :{}",is_growing_boolean);println!("company icon is:{}",icon_char);
}
在上面的代码示例中,变量的数据类型是从被分配的值而推断出来的。例如,变量 company_string 被 Rust 分配了 string 字符串数据类型,变量 rating_float 被分配了 float 浮点数据类型,等等。

println! 宏函数有两个参数

一个参数是占位符 { },特别的语法
一个参数是变量或者常量
占位符将被变量的值替换掉

上述代码片段将输出以下内容

company name is: TutorialsPoint
company rating on 5 is:4.5
company is growing: true
company icon is: ♥

需要注意的是Rust的变量默认为不可变变量

Rust为了糕饼发进行设计,他的变量使用let关键词声明时是默认不可边的

比方说:

let a = 123;

而接下来的三句

a = "abc";
a = 4.56; 
a = 456;

都会报错,so why?

第一行的错误在于当声明 a 是 123 以后,a 就被确定为整型数字,不能把字符串类型的值赋给它。

第二行的错误在于自动转换数字精度有损失,Rust 语言不允许精度有损失的自动数据类型转换。

第三行的错误在于 a 不是个可变变量。

前两种错误很容易理解,但第三个是什么意思?难道 a 不是个变量吗?

这就牵扯到了 Rust 语言为了高并发安全而做的设计:在语言层面尽量少的让变量的值可以改变。所以 a 的值不可变。但这不意味着 a 不是"变量"(英文中的 variable),官方文档称 a 这种变量为"不可变变量"。

如果我们编写的程序的一部分在假设值永远不会改变的情况下运行,而我们代码的另一部分在改变该值,那么代码的第一部分可能就不会按照设计的意图去运转。由于这种原因造成的错误很难在事后找到。这是 Rust 语言设计这种机制的原因。

当然,使变量变得"可变"(mutable)只需一个 mut 关键字。

let mut a = 123;
a = 456;

这样程序就可以运行了

常量与不可变变量的区别

既然不可变变量是不可变的,那不就是常量吗?为什么叫变量?

变量和常量还是有区别的。在 Rust 中,以下程序是合法的:

let a = 123; // 可以编译,但可能有警告,因为该变量没有被使用
let a = 456;

但是如果 a 是常量就不合法:

const a: i32 = 123;
let a = 456;

变量的值可以"重新绑定",但在"重新绑定"以前不能私自被改变,这样可以确保在每一次"绑定"之后的区域里编译器可以充分的推理程序逻辑。 虽然 Rust 有自动判断类型的功能,但有些情况下声明类型更加方便:

let a: u64 = 123;

这里声明了 a 为无符号 64 位整型变量,如果没有声明类型,a 将自动被判断为有符号 32 位整型变量,这对于 a 的取值范围有很大的影响。

重影(Shadowing)

重影的概念与其他面向对象语言里的"重写"(Override)或"重载"(Overload)是不一样的。重影就是刚才讲述的所谓"重新绑定",之所以加引号就是为了在没有介绍这个概念的时候代替一下概念。

重影就是指变量的名称可以被重新使用的机制:

实例

fn main() {  let x = 5;  let x = x + 1;  let x = x * 2;  println!("The value of x is: {}", x);  
}  

这段程序的运行结果:

The value of x is: 12

重影与可变变量的赋值不是一个概念,重影是指用同一个名字重新代表另一个变量实体,其类型、可变属性和值都可以变化。但可变变量赋值仅能发生值的变化。

let mut s = "123";
s = s.len();

这段程序会出错:不能给字符串变量赋整型值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/232309.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[C++从入门到精通] 14.虚函数、纯虚函数和虚析构(virtual)

📢博客主页:https://blog.csdn.net/weixin_43197380📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!📢本文由 Loewen丶原创,首发于 CSDN,转载注明出处🙉&…

解决docker alpine /bin/sh: ./main: not found

解决docker alpine /bin/sh: ./main: not found golang中编译之后的二进制文件部署在alpine镜像中出现了not found问题解决这种情况是因为动态链接库位置错误导致的,alpine镜像使用的是musl libc而不是gun libc。因而动态链接库的位置不一致。在基础镜像内执行&…

shell脚本报错 syntax error near unexpected token `$‘do\r‘‘

在我执行docker-compose up 的时候会去执行一个shell文件,如下图报错 看代码并未发现什么特别的错误 解决方案打开编辑器把分割符CRLF换成LF重新运行,其实是shell的换行符导致的

Elasticsearch的批量bulk 提交 写入的方式会有顺序问题吗?

Elasticsearch的分布式特性可能会导致写入操作的执行顺序与提交顺序稍有不同。在分布式环境中,Elasticsearch将数据分散到不同的节点上进行存储和处理,因此写入操作的执行顺序可能会受到网络延迟、负载均衡等因素的影响。 根源在于ES的分布式架构。如上图所示,客户端的命令首…

Tortoisegit 国内镜像源加速下载

Tortoisegit 国内镜像源加速下载: Index of tortoisegit-local

企业怎么选海外呼叫中心?企业在选择海外呼叫中心时需要考虑哪些关键因素呢?

在当今竞争激烈的商业环境下,企业需要建立一个高效可靠的海外呼叫中心来处理不同国家地区客户的需求和问题。选择合适的呼叫中心对于企业的发展至关重要。那么企业在选择海外呼叫中心时需要考虑哪些关键因素呢? 1.企业在选择海外呼叫中心之前应该明确自…

带大家做一个,易上手的家常辣椒炒鸡蛋

先打四五个鸡蛋 将鸡蛋搅拌均匀 绿辣椒切片 起锅烧油 倒入鸡蛋液 注意用锅铲过一会儿就动一动 别让鸡蛋粘锅了 鸡蛋定型后 用锅铲分成小块 然后 倒入绿辣椒 小半勺生抽 鸡蛋差不多了 就倒入少量盐(一点点就好) 然后 如果有条件 可以倒入一点点 孜然粉胡椒粉 然后就可以装…

GIT 合并分支时 merge和rebase的区别

在实际开发工作中,我们基本上都是在自己的分支上开发,然后需要提交的时候将自己的分支合并到主分支,合并操作有两个rebase和merge。他们有什么区别呢? Merge(合并) Merge是将两个分支的代码变更合并成一个新的提交(c…

chatglm2-6b本地部署(v0.1)

1.前置工具:安装anaconda,安装cuda/cudnn 2.下载安装包和模型 源码安装包:https://github.com/THUDM/ChatGLM2-6B 模型:https://huggingface.co/models?sorttrending&searchchatglm 3.创建并激活环境 conda create --na…

问题表达式

问题表达式 目录 一. 概述二. 例题1. 例子一2. 例子二3. 例子三4. 例子四 三. 分析四. 总结 一. 概述 表达式的求值部分由操作符的优先级决定。但有时会由于编码的不规范,会导致表达式执行顺序混乱&#xf…

文件夹加密有哪些好处?电脑重要文件夹怎么加密?

对于每个使用电脑的人来说,文件夹是非常熟悉的数据管理工具。但文件夹并不具备安全保护功能,很容易导致数据泄露。因此,我们需要对文件夹进行加密。那么,电脑重要文件夹该怎么加密呢?下面我们就来一起了解一下。 文件夹…

【MAC】M2 安装docker 与 mysql

一、docker下载地址 下载地址 二、安装docker完成 罗列一下docker常用命令 # 查看docker版本 docker --version# 拉取镜像 docker pull 镜像名# 查看当前所有镜像 docker images# 查看运行中的容器 docker ps -a docker ps grep| 镜像名#镜像启动操作: sudo dock…

paddleocr 下载超时换源百度 ReadTimeOutError

pip install “paddleocr>2.0.1” -i https://mirror.baidu.com/pypi/simple

logrotate日志切割工具

logrotate 是一个日志文件管理工具。用于分割日志,删除旧的日志,并创建新的日志文件,起到日志滚动的作用。 logrotate 是基于 linux 的 CRON 来运行的,其脚本是 /etc/cron.daily/logrotate。 logrotate配置文件 默认存放位置&am…

Axure中继器案例:中继器的repeater属性,中继器的Item属性

一.中继器的repeater属性 Repeater: 中继器的对象 visibleltemCount: 中继器项目列表中可见项的数量 ltemCount: 加载项数量 dataCount:获取中继器数据集中数据行的总数量 pageCount: 获取中继器分页的总数量,即能够获取分页后共有多少页 pagelndex: 获取中继器项目…

激活函数的认识

一,什么是激活函数? 激活函数(Activation Function)是一种在人工神经网络中使用的函数,其主要目的是引入非线性特性,使得神经网络可以学习和理解复杂、非线性的模式和数据。一个节点的激活函数定义了该节点…

强大矢量图编辑器 Boxy SVG 激活最新

Boxy SVG for Mac功能介绍 1、干净,直观的UI深受Inkscape,Sketch和Adobe illustrator的启发 2、广泛支持画布上编辑对象几何,转换,绘画和其他属性 3、保存为SVG和SVGZ格式,导出为PNG,JPG,WebP和…

TypeScript 中的高级类型(联合、交叉、泛型、映射类型)

文章目录 一、联合类型(Union Types)二、交叉类型(Intersection Types)三、泛型3.1 泛型结合extends3.2 泛型结合 keyof3.3 extends keyof 和 in keyof 的区别 四、条件类型(Conditional Types) TypeScript…

【C++】— —期末复习题(五)

🎃个人专栏: 🐬 算法设计与分析:算法设计与分析_IT闫的博客-CSDN博客 🐳Java基础:Java基础_IT闫的博客-CSDN博客 🐋c语言:c语言_IT闫的博客-CSDN博客 🐟MySQL&#xff1a…

原核蛋白表达——卡梅德生物

在生物技术领域,原核蛋白表达系统作为一项重要的生物工程技术,为研究者提供了简便高效的蛋白质表达解决方案。本文将介绍原核蛋白表达的基本原理、常用的表达系统和载体,以及与真核蛋白表达系统的对比。 原核蛋白表达基于细菌细胞&#xff08…