1. 為什麼需要 Option
在 C/C++ 或其他語言裡,常用 null / nullptr / None 來代表沒有值,Rust 沒有 null,取而代之的是標準庫的 enum,這樣能避免 null pointer 錯誤:
enum Option<T> {
Some(T),
None,
}
2. 基本範例
fn main() {
let x: Option<i32> = Some(5);
let y: Option<i32> = None;
println!("x = {:?}, y = {:?}", x, y);
}
輸出:
x = Some(5), y = None
3. 使用 match 來處理 Option
因為 Option 可能是 Some(T) 或 None,所以用 match 來分支:
fn plus_one(x: Option<i32>) -> Option<i32> {
match x {
Some(i) => Some(i + 1),
None => None,
}
}
fn main() {
let five = Some(5);
let six = plus_one(five);
let none = plus_one(None);
println!("six = {:?}, none = {:?}", six, none);
}
輸出:
six = Some(6), none = None
4. match 的範圍匹配
match 不只是用在 Option,也能用在一般數值或 enum:
fn main() {
let number = 3;
match number {
1 => println!("one"),
2 | 3 => println!("two or three"),
4..=10 => println!("between 4 and 10"),
_ => println!("other"),
}
}
輸出:
two or three
這裡 3 符合 2 | 3 這個模式,所以輸出 two or three
5. if let 語法糖
如果只關心一種情況,可以用 if let:
fn main() {
let some_number = Some(3);
if let Some(3) = some_number {
println!("Matched number 3!");
}
}
輸出:
Matched number 3!
6. 學習心得與補充
今天學到的 Option 讓我特別有感,因為它直接解決了許多語言中空值帶來的麻煩。以前在 C++ 寫程式時,常常會遇到指標是 nullptr 卻沒檢查,導致執行時出錯,而在 Rust 裡,用 Option 強迫我一定要處理有值和沒值這兩種情況。搭配 match 來做完整的分支,也讓程式更清楚。我覺得這和昨天學的 enum 串了起來,因為 Option 本身就是一個 enum,只不過是標準庫已經幫我定義好的。我也很喜歡 if let 這種語法糖,雖然簡單,但在只關心一種情況時讓程式更簡潔。整體來說,今天不只是看到 Rust 嚴格帶來的好處,也發現它同時提供像 if let 這樣的語法糖,讓程式在需要時更簡潔。這種嚴謹中帶著靈活的感覺讓我覺得設計很聰明。