变量与可变性
本课开始"常见编程概念"系列,主题:变量与可变性。后续课程依次覆盖数据类型、函数、控制流。
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; // OKmut(mutable)同时起两个作用:允许修改,并向读者声明"这个变量会变"。猜数字游戏里的 let mut guess = String::new(); 就是因为 read_line 要向其写入。
3. 未使用变量
声明了却没使用的变量会触发 unused variable 警告。确属故意保留时,变量名前加下划线即可消除警告:
rust
let _x = 3; // 无警告4. 常量:const
rust
const MAX_POINTS: u32 = 100_000;常量与不可变变量有三大区别:
- 必须标注类型,不能省略
- 可声明于任何作用域,包括函数体内和全局
- 只能绑定常量表达式(编译期就能算出值),不能是运行时才得到的结果
命名约定为全大写蛇形(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 这类名字。