作用域和隐藏 (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}"); }