Rust变量¶
变量命名¶
遵循驼峰命名法(camelCase)或蛇形命名法(snake_case),而且两种方法都有对应的适用场景,具体规范可参考命名规范 | Rust语言圣经。
变量绑定¶
与其他语言所谓的赋值,不同在Rust中,采用了绑定这个名词来描述变量的初始化操作,这牵扯到Rust中的一个核心语言特性:所有权系统。
简单来说,任何内存对象都是有主人的,而且一般情况下完全属于它的主人,绑定就是把这个对象绑定给一个变量,让这个变量成为它的主人,在这种情况下,该对象之前的主人就会丧失对该对象的所有权1。
变量可变性¶
在Rust中,变量默认是不可变的,这意味着一旦一个值被绑定到一个变量上,就不能再改变这个值了。如果需要改变变量的值,必须使用mut关键字来声明一个可变变量。
let x = 5; // immutable variable
let mut x = 5; // mutable variable
如果尝试修改一个不可变变量的值,那么你就会吃到如下报错:
$ cargo run
Compiling variables v0.1.0 (/home/virtualguard/vg101/notebooks/vglab/lang/rust/variables)
error[E0384]: cannot assign twice to immutable variable `x`
--> src/main.rs:12:5
|
7 | let x = 5; // immutable variable
| - first assignment to `x`
...
12 | x = 6;
| ^^^^^ cannot assign twice to immutable variable
|
help: consider making this binding mutable
|
7 | let mut x = 5; // immutable variable
| +++
For more information about this error, try `rustc --explain E0384`.
error: could not compile `variables` (bin "variables") due to 1 previous error
格式化输出的三种形式¶
-
一种是命名捕获(直接从当前作用域取变量):
println!("The value of x is: {x}"); // named capture (std::fmt::Display) -
另一种是位置参数(位置占位符 + 逗号传参):
println!("The value of x is: {}", x);// position placeholder + comma argument (std::fmt::Display) -
还有一种是调试输出(Debug占位符 + 逗号传参):
println!("a: {:?}, b: {:?}", a, b); // Debug placeholder + comma argument (std::fmt::Debug)
变量解构¶
let 表达式不仅仅用于变量的绑定,还能进行复杂变量的解构:从一个相对复杂的变量中,匹配出该变量的一部分内容。类似 C++ 中的结构化绑定。
自 Rust1.59 起,左值开始支持使用元组、切片和结构体模式。
常量¶
和其他语言类似,Rust使用const关键字来声明一个常量。常量必须在编译时就能确定其值,并且在运行时不能被修改。
const MAX_POINTS: u32 = 100_000;
Warning
注意常量和普通变量的区别,前者是至始至终不可变,后者只是默认不可变。
变量遮蔽¶
在Rust中,变量遮蔽(variable shadowing)是指在同一作用域内,后面声明的变量可以覆盖前面声明的同名变量。这种机制允许我们在不使用mut关键字的情况下改变变量的值。