🎯
パターンマッチング — matchとif letで分岐する
switch/caseの上位互換、Rustコードの核心表現方式
C/Javaのswitch-caseは値を比較するだけだ。Rustのmatchは値を分解(destructure)しながら同時に分岐する。
match some_option {
Some(value) => println!("got {value}"),
None => println!("nothing"),
}
Some内の値を取り出しながら分岐が同時に起きる。コンパイラが全ケースを処理したか検査する。1つでも漏れるとコンパイルが通らない。
if letはmatchの省略形だ。1パターンだけ関心がある時に使う:
if let Some(value) = some_option {
println!("got {value}");
}
enum、タプル、構造体、参照 — Rustのほぼ全ての型をパターンで分解できる。
キーポイント
1
match式に値を入れると各armのパターンと順番にマッチング
2
パターンが値を分解しながら変数にバインド
3
exhaustive — 全ての可能なケースを漏れなく処理しないとコンパイル不可
4
_(ワイルドカード)で残りのケースを一括処理可能
メリット
- ✓ コンパイラが漏れケースを検出
- ✓ 値比較+分解+バインドが一度に
デメリット
- ✗ 深いネストパターンは可読性が下がることがある
ユースケース
Result/Option処理 — 成功/失敗、有/無を明示的に分岐
enumベース状態マシン — 各状態の動作をパターンで定義