Day 5:Option 深入

學習目標

  • 熟練 Option 的常見方法
  • 用 unwrap_or / map / filter 等組合
  • 理解 Option 是「可空性」的安全版

今日重點

Option 是內建的

enum Option<T> {
    Some(T),
    None,
}

Rust 沒有 null。可空性用 Option<T> 表達,編譯器強迫你處理「可能沒有值」的情況。

常見方法

fn divide(a: f64, b: f64) -> Option<f64> {
    if b == 0.0 { None } else { Some(a / b) }
}

fn main() {
    // match
    match divide(10.0, 3.0) {
        Some(v) => println!("{}", v),
        None => println!("cannot divide by 0"),
    }

    // unwrap_or:給預設值
    let v = divide(10.0, 0.0).unwrap_or(0.0);
    println!("{}", v);

    // map:變換值(只在 Some 時執行)
    let doubled = divide(10.0, 2.0).map(|x| x * 2.0);
    println!("{:?}", doubled);

    // 鏈式操作
    let result = divide(100.0, 4.0)
        .map(|x| x * 2.0)
        .filter(|&x| x > 10.0)
        .unwrap_or(0.0);
    println!("{}", result);
}

常用方法一覽

方法 用途
is_some() / is_none() 檢查
unwrap() 取值(None 會 panic,謹慎用)
unwrap_or(default) None 給預設值
map(f) 只變 Some
and_then(f) 串接回傳 Option 的函式
filter(pred) 過濾
unwrap_or_else(closure) None 時算預設值

練習

fn sqrt_if_even(n: u32) -> Option<f64> {
    if n % 2 == 0 { Some((n as f64).sqrt()) } else { None }
}

fn main() {
    // 用 and_then 串接:先除、再開根號
    let r = divide(100.0, 2.0).and_then(|x| sqrt_if_even(x as u32));
    println!("{:?}", r);
}

自我檢查

  • 理解 Option 取代 null 的安全意義
  • 熟練 unwrap_or / map / and_then / filter
  • 知道 unwrap 何時會 panic
  • 會鏈式組合 Option 操作

深入連結

  • The Book 第 6 章「The Option Enum and Its Advantages over Null Values」