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」