今天學習的是Rust的變數特性,包含不可變性、可變性(mut)以及遮蔽(shadowing)。這是Rust其中一個跟其他語言不一樣的部分,這個預設禁止的特色讓我對程式語言之間的不同有了全新的認識。
1. Rust中的變數
在Rust中宣告變數要使用let:
fn main() {
let x = 5;
println!("x = {}", x);
}
在Rust中,這裡的x預設是不可變的,如果我寫:
x = 6;
就會編譯錯誤:
error[E0384]: cannot assign twice to immutable variable `x`
這個部分跟我以往學習過的程式語言有非常大的不同,像是C或C++就可以直接更改變數的值,不禁讓我開始思考Rust為什麼要做出這種看起來對使用者非常不方便的設計。
2. 可變變數(mut)
如果真的需要改變變數,就要加上mut:
fn main() {
let mut y = 10;
println!("y = {}", y);
y = 20;
println!("y = {}", y);
}
輸出:
y = 10
y = 20
在使用mut的情況下,變數就能夠跟其他語言一樣可以直接更改,在這裡我突然想到以前寫程式時如果程式碼特別長可能會在撰寫時犯一些錯誤,但如果在一開始就決定好變數能不能被改變,在寫的時候如果遇到相關的錯誤就可以直接知道哪部分的想法可能有錯,在debug的時候或許能節省許多時間。
3. Shadowing(遮蔽)
Shadowing允許我用同樣的變數名稱重新宣告一次:
fn main() {
let z = 5;
let z = z + 1; // shadowing
let z = z * 2; // 再次 shadowing
println!("z = {}", z);
}
輸出:
z = 12
和mut不同,Shadowing不是修改原本的變數,而是創造一個新變數蓋掉舊的,且使用shadowing甚至能夠更改變數的型別:
let spaces = " "; // 字串
let spaces = spaces.len(); // 整數
shadowing的概念對之前主要使用C/C++的我來說是一個很新奇的概念,能夠重新建立一個新的變數,因此可以換型別對於我曾經遇到過的問題來說似乎是一個非常方便的解法。
4. 學習心得與補充
今天學到Rust的變數特性,讓我對「安全性」和「程式設計習慣」有了新的體會。在C/C++裡我很習慣直接改變變數的值,甚至沒有特別想過「這個值是否應該保持不變」。Rust強迫我在一開始就決定這個值要不要能改?
這個規範看似麻煩,但我發現它其實可以幫助我在寫程式時更清楚地表達意圖。如果一個值不該改變,那麼它會被設計成不可變,不但能減少出錯的機會,也讓程式的可讀性更高。
而Shadowing對我來說很新奇,它不像mut是單純的修改,而是像「替換掉舊的概念」。讓我想到以前常常因為型別不同而多取一堆變數名稱,現在在Rust裡用Shadowing就能讓程式更簡潔,也能省去許多不必要的麻煩。
我覺得Rust的變數設計雖然嚴格,但他同時能幫助我培養更好的寫程式習慣。