变量和可变性
默认情况下变量是不可变的(immutable),这是 Rust 众多精妙之处的其中一个,这些特性让你充分利用 Rust 提供的安全性和简单并发性的方式来编写代码,不过你也可以选择让变量是可变的(mutable)
当变量不可变时,这意味着一旦一个值绑定到一个变量名后,就不能更改该值了,为了说明,我们在 projects 目录下使用 cargo new variables
来创建一个名为 variables 新项目
然后在新建的 variables 目录下,打开 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
运行程序。你将会收到一条错误信息,输出如下所示:
$ cargo run
Compiling variables v0.1.0 (file:///projects/variables)
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
For more information about this error, try `rustc --explain E0384`.
error: could not compile `variables` due to previous error
上面的错误指出错误的原因是 cannot assign twice to immutable variable x
(不能对不可变变量二次赋值),因为我们尝试给不可变的 x
变量赋值为第二个值
当我们尝试改变一个前面指定为不可变的值时我们会得到编译期错误,这点很重要,因为这种情况很可能导致 bug,如果我们代码的一部分假设某个值永远不会更改,而代码的另一部分更改了该值,那很可能第一部分代码以不可意料的方式运行,这个 bug 的根源在实际开发中可能很难追踪,特别是第二部分代码只是偶尔变更了原来的值,Rust 编译器保证了当我们声明了一个值不会改变时,那它就真的不可改变,所以你不必亲自跟踪这个值,这可以使得代码更容易理解
但可变性有时也相当重要,可使代码更方便编写,变量只是默认不可变的;我们可以通过在变量名前加上 mut
使得它们可变,增加 mut
的操作还向以后的读代码的人传达了代码的其他部分将会改变这个变量值