iT邦幫忙

2025 iThome 鐵人賽

DAY 13
0
Rust

Rust 30 天養成計畫:從零到 CLI 專案系列 第 13

Day 13:Option 與模式比對 (match)

  • 分享至 

  • xImage
  •  

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 這樣的語法糖,讓程式在需要時更簡潔。這種嚴謹中帶著靈活的感覺讓我覺得設計很聰明。


上一篇
Day 12:Enum(列舉型別)
系列文
Rust 30 天養成計畫:從零到 CLI 專案13
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言