Rust的Shadowing变量

22-10-09 banq

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); 
}


运行结果:

X 的值 = 15
重新分配后,X 的值 = 20


为什么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); 
}


我们得到

X 的值 = 15
重新分配后,X 的值 = 35


查看下图以了解阴影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用于定义常量,它在程序的整个运行过程中都有效。常量的值不能是需要在运行时计算的东西。