rust设置界面中文翻译:Rust文档翻译,ch03-01变量和可变性
原文:https://doc.rust-lang.org/book/ch03-01-variables-and-mutability.html
变量和可变性在”Storing Values with Variables”(将值存入变量)这部分就提到过,默认Rust变量是不可变的(imutable)。这也是Rust让你编写更安全和更容易并发代码的一种方式。当然,你还是可以让你的变量可变。让我们先来看看Rust是如何以及为什么鼓励你使用不可变变量,以及在什么时候我们需要使用正常可变的变量。
所谓变量不可变(immutable),就是一旦值和变量名绑定,你就不能更改这个值了。为了说明这个,让我们创建一个名叫variables的项目,使用cargo new variables命令。
进入新创建的variables目录,打开src/main.rs,将文件内容替换为下面的代码。这代码还不能正常编译,主要是用来解释默认变量是不可变的。
文件名: src/main.rs
fn main() { let x = 5; println!("The value of x is: {x}"); x = 6; println!("The value of x is: {x}");}
保存,运行程序。使用cargo run。你可以看到以下出错信息:
mutability error
这个例子展示了编译器如何帮助你发现程序问题的。编译错误通常都是挺烦人的,不过这并不说明你不是一个好的程序员,只是说明你的程序还没有足够安全的来完成你想要实现的目标。就算是非常有经验的Rust程序员,同样会经常收到编译错误。
出错信息也告诉你了,cannot assign twice to immutable variable,不能对不可变变量x进行两次赋值。
编译期就能够将修改不可变变量这种操作报出来,相当重要。因为这非常容易造成bug。如果你的一段代码是基于某个值不能变的,而另一段代码却去修改这个值,那很可能造成之前那段代码不能正常运行。这种类型的bug非常难查,特别是这个值只是在某些特定时候被改变。Rust编译器可以保证,你既然申明了这个值不可变,它就不会变,编译器会帮你去跟踪这个值。你的代码也更容易去推断。
但是可变性还是相当有用的,也可以让你的代码更容易去写。尽管变量默认是不可变的,但是你可以通过在变量名前加上mut用来声明变量是可变的。在第二章里面我们已经这么做过了。加上mut之后,也是告诉之后读代码的人,这个变量是可以修改的。
接着,让我们把mut加到刚才的main.rs里面去。
文件名: src/main.rs
fn main() { let mut x = 5; println!("The value of x is: {x}"); x = 6; println!("The value of x is: {x}");}
再运行代码,就能输出我们希望的结果了。
mutable variable
加上mut之后,x的值就能改成6了。当然,变量是否可变在于你自己的设计,只有写程序的人才最清楚在哪个特定场合,变量是否可变。
常量与不可变变量很像,常量也是在绑定到一个名字之后,它的值是不能变的。不过常量和不可变变量还是有点区别的。
首先你不能给常量添加mut。常量不单单是默认不可变,而是永远不可变。常量使用const,而变量使用let关键字,而且常量必须指定类型。我们会在下一章”Data Types”(数据类型)讨论类型。这里你只要记住常量必须指定类型。
第二点,常量可以定义在任何地方,包括全局定义,比较适合需要被许多代码引用的值。
最后,常量只能通过常量表达式进行赋值,不能在运行时计算出来。
例子:
const THREE_HOURS_IN_SECONDS: u32 = 60 * 60 * 3;
常量名是THREE_HOURS_IN_SECONDS,值是60*60*3的运算结果。Rust通常使用全部大写,单词之间用下划线(_)分隔来命名常量。编译器可以在编译期计算这个常量值,所以我们可以使用可读性更高的60*60*3,而不是10800。参考Rust Reference’s section on constant evaluation(Rust语言参考的常量计算部分)来了解哪些操作可以在常量定义的时候使用。
常量在程序运行的整个生命周期里面都有效。对于那些在程序的多个部分都需要使用的值比较有用。比如游戏里面每个成员能够获得的点数最大值,或者光速值。
将那些硬编码的值用常量代替,让之后的代码维护人员更容易了解值的含义,并且当需要修改的时候,动一个地方就行。
遮挡(Shadowing)在第二章的猜谜游戏里面,可以看到,用之前声明过的变量名,重新声明一个新的变量。Rust程序员把这个称谓第二个变量把第一个变量遮挡了(Shadowed)。也就是说当你使用这个变量名的时候,编译器看到的是第二个变量,直到它被后面的变量所遮挡,或者跳出了它的定义范围。
文件名:src/main.rs
fn main() { let x = 5; let x = x 1; { let x = x * 2; println!("The value of x in the inner scope is: {x}"); } println!("The value of x is: {x}");}
这段代码首先把x设为5, 然后加1,赋给新的x变量,然后在内部代码块,让x乘2,赋给又一个新的x变量。代码块内部,我们得到12,走出代码块,就回到了第二个x变量,所以输出结果会是6。
运行结果如下:
shadowing
遮挡(Shadowing)和使用mut不一样,比如我们对变量不加上let赋值,编译器就会直接报错。let可以新生成一个不可变的变量,所以可以用于一些变量的转换操作,新得到的变量还是不可变的(immutable)。
由于会新生成变量,新变量甚至可以和原来的变量是不同的数据类型。比方说下面的代码需要得到空格的数量。
let spaces = " ";let spaces = spaces.len();
第一个spaces变量是字符串,而第二个spaces变量则是数字。这样就省去了有些语言里面必须要使用两个变量名,比如spaces_str和spaces_num。这里我们不能使用mut,因为mut不能改变数据类型,比如下面的代码:
let mut spaces = " ";spaces = spaces.len();
可以看到编译错误:
Shadowing mut error
好了,看过变量怎么工作的,让我们来了解更多的数据类型。
- 02-04秋天天山天池值得去吗?天山天池一下雪就美成了瑶池仙境
- 11-03女性盆腔炎有哪些特征怎么治?症状和治疗方法有哪些
- 11-18夏日绝句古诗35首,夏夜古诗七首热极不可度
- 01-12材料世界漫谈 材料江湖,微沙龙
- 01-22天热吃什么预防中暑?人体如果缺乏这种营养素
- 05-19轻轻告诉你我已爱上了你:我只想告诉你,爱上你
- 02-05江淮嘉悦x7深度解析:江淮乘用车3.0时代的又一次反攻
- 02-21买的学区房跌惨了怎么办?买二手学区房这些事千万别再犯
- 12-23李亚男和王祖蓝身高相差多少 身高175的李亚男决定与身高163的王祖蓝共...
- 04-10当代大学生请假有多硬核:大学生这几天不得请假
- 05-269月北戴河鸽子窝看日出几点最佳 9月,山前有风高月白松花晚霞
- 03-02萝卜干如何腌制才香脆?教你腌制萝卜干简单几步
- 06-01暗紫色壁纸原图:纯紫色壁纸或许你也喜欢紫色
- 12-17苏茂洋长大的样子 苏茂洋懂得生命的意义
- 12-16最好吃的三大网红零食:21个韩国网红零食第5个太好吃了吧
- 02-03蜗牛先生讲故事:骏哥讲故事,鱼目混珠假珍珠的代价
热门
推荐
- 1三年级上册语文七颗钻石教案142
- 2家庭兰草的养殖方法有哪些335
- 3通信建设工程的优秀实习报告225
- 4欢快温馨的歌曲排行榜178
- 5老师给初二学生的简单评语350
- 6学会思考的小学日记355
- 7文明礼仪演讲稿范文_学会做人205
- 8园区揭牌仪式领导讲话320