深入探讨 Rust 中默认不可变设计的工程哲学,变量遮蔽 (Shadowing) 的内存重用机制,以及常量与不可变变量的核心差异。

1. 为什么 Rust 的变量默认是不可变的?

在大多数编程语言中,变量默认可变。Rust 选择默认不可变(Immutable)的核心原因在于并发安全与代码可推导性:

  • 如果数据不可变,多个线程同时读取时绝对不可能发生数据竞争(Data Race)。
  • 阅读代码时,无需担心某个函数在深层调用链中意外修改了全局或传入的局部变量。
fn main() {
    let mut x = 5;
    println!("初始值: {}", x);
    x = 6; // 必须有 mut 关键字才允许修改
    println!("修改后: {}", x);
}

2. 变量遮蔽 (Shadowing) 的妙用

Rust 允许通过重复使用 let 声明同名变量来遮蔽之前的变量。这不仅可以改变变量的值,还可以改变其数据类型,同时保持不可变性:

let spaces = "   "; // &str 类型
let spaces = spaces.len(); // 转换为 usize 类型,同名变量遮蔽