变量
默认情况下变量是不可变的(immutable),虽然变量不可变听着有点奇怪,但这些特性可以让你充分利用 Rust 提供的安全性和简单并发性的方式来编写代码。不过你也可以选择让变量是可变的(mutable)。
在以下代码中,由于尝试对不可变的变量 x 的值进行修改,在编译阶段产生类报错。
fn main() {
let x = 5;
println!("The value of x is: {}", x);
x = 6;
println!("The value of x is: {}", x);
}
编译运行该代码会得到以下报错:
error[E0384]: cannot assign twice to immutable variable `x`
--> src/main.rs:4:5
|
2 | let x = 5;
| -
| |
| first assignment to `x`
| help: consider making this binding mutable: `mut x`
3 | println!("The value of x is: {}", x);
4 | x = 6;
| ^^^^^ cannot assign twice to immutable variable
如果要让代码可以编译,只需要将 let x = 5;
修改为 let mut x = 5;
,即可通过编译。
常量(constant)
与不可变变量类似,常量(constant)是绑定到一个常量名且不允许更改的值,但是常量和变量之间存在一些差异。
- 首先,常量不允许使用
mut
。常量不仅仅默认不可变,而且自始至终不可变。常量使用const
关键字而不是let
关键字来声明,并且值的类型必须注明。 - 常量可以在任意作用域内声明,包括全局作用域,这对于代码中很多部分都需要知道一个值的情况特别有用。
- 最后一个不同点是常量只能设置为常量表达式,而不能是函数调用的结果或是只能在运行时计算得到的值。
Rust 常量的命名约定是全部字母都使用大写,并使用下划线分隔单词。
遮蔽(shadow)
rust 中可以声明和前面变量具有相同名称的新变量。第一个变量将被第二个变量遮蔽(shadow),这意味着当我们使用变量时我们看到的会是第二个变量的值。我们可以通过使用相同的变量名并重复使用 let
关键字来遮蔽变量,如下所示:
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,在该作用域下通过重复使用 let 声明变量来遮蔽了前一个 x,使新的 x 的值为 6。然后进入了内部作用域,再次通过第三个 let 来遮蔽外部的 x,得到内部的 x 值为 12。内部的遮蔽结束后最后的外部代码得到的 x 仍然是外部作用域中值为 6 的变量 x。
因此,程序运行的结果如下:
The value of x in the inner scope is: 12
The value of x is: 6