🎯

パターンマッチング — 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ベース状態マシン — 各状態の動作をパターンで定義