作用域和隐藏 (Shadowing)

你可以隐藏变量,位于外部作用域的变量和 相同作用域的变量都可以:

fn main() {
    let a = 10;
    println!("before: {a}");

    {
        let a = "hello";
        println!("inner scope: {a}");

        let a = true;
        println!("shadowed in inner scope: {a}");
    }

    println!("after: {a}");
}
  • 定义: 隐藏和变更 (mutation) 不同,因为在隐藏之后,两个变量都会同时存在于内存的不同位置中。在同一个名字下的两个变量都是可以被使用的,但是你在代码的哪里使用会最终决定你使用哪一个变量。
  • 一个隐藏变量可以具有不同的类型。
  • 隐藏起初看起来会有些晦涩,但是它很便于存 .unwrap() 之后的得到的值。
  • 以下代码说明了为什么在作用域内隐藏一个不可变的变量时,即使是在变量类型没有改变的情况下,编译器也不能简单地重复利用之前的内存位置。
fn main() {
    let a = 1;
    let b = &a;
    let a = a + 1;
    println!("{a} {b}");
}