Rust默认情况下将所有分配的变量视为不可变的。这意味着一旦绑定完成,(另一个Rust概念,仅表示已将值分配给变量),您不能用不同的值重新分配该变量:
下面代码是无法运行的: fn main() { // 变量默认是不可变的,只有使用 `mut` 关键字使 // 可变 concept1 () }
fn concept1() { let x: i8 = 15; println!("X 的值 = {}", x); x = 20; println!("重新赋值后,X 的值 = {}", x); }
|
出现编译错误:
错误 [E0384]: 不能为不可变变量 `x` 分配两次 --> src/main.rs:17:5 | 15 | 让 x: i8 = 15; | - | | | 第一次赋值给`x` | 帮助:考虑使这个绑定可变:`mut x` 16 | println!("X 的值 = {}", x); 17 | x = 20; | ^^^^^^ 不能为不可变变量分配两次 有关此错误的更多信息,请尝试“rustc --explain E0384”。 错误:由于先前的错误,无法编译“day1”
|
那么,问题来了,我们如何运行计数器?简单的答案是使变量可变
fn main() { concept1() // 变量默认是不可变的,使用 `mut` }
fn concept1() { let mut x: i8 = 15; println!("X 的值 = {}", x); x = 20; println!("重新赋值后,X 的值 = {}", x); }
|
运行结果:
为什么Rust会这样,Shadowing使然。
事实上, Shadowing也允许我们改变变量的类型。
简而言之,通过使用let关键字,我们正在创建另一个具有相同名称的变量。
fn main() { variables_are_immutable(); variable_shadowing() }
fn variables_are_immutable() { .... }
fn variable_shadowing() { let x: i8 = 15; println!("X 的值 = {}", x); [b]let[/b] x = x + 20; // 与之前代码相比,这里多了 `let` 关键字 println!("重新赋值后,X 的值 = {}", x); }
|
我们得到
查看下图以了解阴影shadow和代码:
value of shadowed_variable is 10 -> 1st Value value of shadowed_variable is ten -> 2nd Value value of shadowed_variable is 10 -> First Value in different scope value of shadowed_variable is scope check -> 2nd Value different scope value of shadowed_variable is 20 -> 3rd Value First value of shadowed_variable is 10 -> 1st Value accessed using reference variable first_value
|
正如你所看到的,Shadowing在内部的工作方式就像一个堆栈,你可以通过使用drop(shadowed_variable)来移除之前的值,它将表现得像堆栈一样,并开始以lifo的方式弹出值。请记住,只有当变量在范围内时,阴影变量才能工作。
同样,const用于定义常量,它在程序的整个运行过程中都有效。常量的值不能是需要在运行时计算的东西。