Rust的Shadowing變數

banq發表於2022-10-09

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和程式碼:

Rust的Shadowing變數

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用於定義常量,它在程式的整個執行過程中都有效。常量的值不能是需要在執行時計算的東西。
 

相關文章