Skip to content

变量与可变性 ​

本课开始"常见编程概念"系列,主题:变量与可变性。后续课程依次覆盖数据类型、函数、控制流。

1. 变量默认不可变 ​

rust
let x = 5;
x = 6;

这段代码无法编译,报错:

text
error[E0384]: cannot assign twice to immutable variable `x`

Rust 中变量默认不可变:绑定之后就不能再赋值。这是语言层面的刻意设计 —— 大部分变量赋值后确实不需要再变,默认不可变让编译器和读者都能确信"这个值不会中途改变",代码更易推导。需要可变时,显式声明。

2. mut:显式声明可变 ​

rust
let mut x = 5;
x = 6; // OK

mut(mutable)同时起两个作用:允许修改,并向读者声明"这个变量会变"。猜数字游戏里的 let mut guess = String::new(); 就是因为 read_line 要向其写入。

3. 未使用变量 ​

声明了却没使用的变量会触发 unused variable 警告。确属故意保留时,变量名前加下划线即可消除警告:

rust
let _x = 3; // 无警告

4. 常量:const ​

rust
const MAX_POINTS: u32 = 100_000;

常量与不可变变量有三大区别:

  1. 必须标注类型,不能省略
  2. 可声明于任何作用域,包括函数体内和全局
  3. 只能绑定常量表达式(编译期就能算出值),不能是运行时才得到的结果

命名约定为全大写蛇形(UPPER_SNAKE_CASE);数字字面量可插入下划线 100_000 提高可读性。

5. 遮蔽(shadowing) ​

可以重复 let 声明同名变量,后者遮蔽前者:

rust
let x = 5;
let x = x + 1; // 6
let x = x * 2; // 12

遮蔽与 mut 的关键差异:遮蔽可以改变类型。

rust
let spaces = "   ";
let spaces = spaces.len(); // OK:&str 遮蔽为 usize

let mut spaces = "   ";
spaces = spaces.len(); // 编译错误:&str 与 usize 类型不匹配

用 mut 时类型不能变;用遮蔽则可以借同名完成"转换链",避免起 spaces_str、spaces_num 这类名字。