隐藏(Shadowing) 如你在第二章猜数字游戏教程所见,你可以声明一个新的变量用和前面声明的变量同样的名字。Rustaceans说第一个变量被第二个隐藏(Shadowing)了,意思是第二个变量的值是在程序使用时才看到的。我们可以shadow一个变量使用相同的变量名,并重复地使用let关键字,如下:
src/main.rs
1 2 3 4 5 6 7 8 9 10 11 12 fn main () { let x = 5 ; let x = x + 1 ; { let x = x * 2 ; println! ("The value of x in the inner scope is: {}" , x); } println! ("The value of x is: {}" , x); }
程序首先绑定了5给x。然后重新用let x=隐藏了x,使得原来的值加1,所以变量的值变为了6。然后,在内部作用域,第三次let声明x, 将之前的值乘以2得到12。当内部作用结束,内部的隐藏结束,并且x变回6。当我们运行这个程序,它运行结果如下:
1 2 3 4 5 6 $ cargo run Compiling variables v0.1.0 (file:///projects/variables) Finished dev [unoptimized + debuginfo ] target (s) in 0.31 s Running `target/debug/variables` The value of x in the inner scope is: 12 The value of x is: 6
隐藏不同于将变量标记为mut,因为如果我们意外地尝试重新分配这个变量不使用let关键字,我们会得到一个编译错误。通过使用let,我们可以对一个值执行一些转换,但在这些转换完成后,变量是不可变的。
其他的mut和shadowing之间的不同之处是因为当我们再次使用let关键字,我们实际上创建了一个新的变量。例如,假如我们的程序要求用户输入空格来显示文本之间需要多少空格,然后我们希望将输入存储为数字:
1 2 3 4 fn main () { let spaces = " " ; let spaces = spaces.len (); }
首先spaces变量是一个string类型,然后第二个spaces变量是数字类型。因此shadowing使我们不需使用不同的变量名,如space_str 和 space_num;然而,如果我们尝试使用mut,如下,我们会得到一个编译时错误:
1 2 3 4 fn main () { let mut spaces = " " ; spaces = spaces.len (); }
错误说我们不被允许转变变量的类型:
1 2 3 4 5 6 7 8 9 10 $ cargo run Compiling variables v0.1.0 (file: error[E0308]: mismatched types --> src/main.rs:3 :14 | 3 | spaces = spaces.len (); | ^^^^^^^^^^^^ expected `&str `, found `usize ` For more information about this error, try `rustc --explain E0308`. error: could not compile `variables` due to previous error
现在,我们探索了变量是如何工作的,我们还有更多的数据类型等着你呢!