Rust的Shadowing變數
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用於定義常量,它在程式的整個執行過程中都有效。常量的值不能是需要在執行時計算的東西。
相關文章
- Rust的變數型別__Data typeRust變數型別
- C++與Rust變數宣告的比較C++Rust變數
- Rust 使用 dotenv 來設定環境變數Rust變數
- 翻譯|Rust臨時變數的生命週期和“Super Let”Rust變數
- rust程式中設定和訪問環境變數Rust變數
- 【Rust學習】記憶體安全探秘:變數的所有權、引用與借用Rust記憶體變數
- Rust 程式設計影片教程對應講解內容-變數Rust程式設計變數
- 變數的分類(臨時(本地)變數、環境變數、全域性變數和系統變數)變數
- 成員變數、全域性變數、例項變數、類變數、靜態變數和區域性變數的區別變數
- Rust 程式設計視訊教程對應講解內容-變數Rust程式設計變數
- Rust 程式設計影片教程(進階)——025_4 訪問或者修改可變靜態變數Rust程式設計變數
- Rust 程式設計視訊教程(進階)——025_4 訪問或者修改可變靜態變數Rust程式設計變數
- Python中類變數、成員變數、區域性變數的區別Python變數
- 淺談變數型別之外的變數命名變數型別
- Spark 外部變數和BroadCast變數的區別Spark變數AST
- c++中的變數型別_C ++中的變數C++變數型別
- 不用第三個變數,交換變數的值變數
- 潛力:如何讓Rust變得更高階?Rust
- MySQL中變數的定義和變數的賦值使用MySql變數賦值
- Java中變數之區域性變數、本類成員變數、父類成員變數的訪問方法Java變數
- JS中的變數JS變數
- SCSS 變數的宣告CSS變數
- MySQL變數的使用MySql變數
- go 的變數使用Go變數
- 變數的基本使用變數
- Linux架構27 Ansible變數, 定義變數的方式, 變數註冊, facts快取Linux架構變數快取
- Python中的全域性變數和區域性變數Python變數
- python變數與變數作用域Python變數
- Ansible fact變數與魔法變數變數
- Rust將如何改變機器人技術?Rust機器人
- 變數變數
- js-js的全域性變數和區域性變數JS變數
- 不使用臨時變數交換兩個變數的值變數
- 共享變數、廣播變數,累計器的工作原理圖。變數
- 宣告變數的問題變數
- Mysql變數宣告的方式MySql變數
- 變數命名的糾結變數
- MySQL中的@變數名MySql變數