本文へスキップ
BecomeCoder

Rustコース · 第2章 制御構文と関数 · レッスン10

match ― 強力な分岐

ブラウザで完結

導入

match(マッチ)は、値をいくつものパターンと照合して分岐する構文です。他言語の switch に似ていますが、はるかに強力で、Rust プログラミングの中心にある道具です。ここでは基礎を押さえ、第7章の enum / Option で本領を体感します。

説明

fn main() {
    let n = 3;

    let name = match n {
        1 => "いち",
        2 => "に",
        3 => "さん",
        4 | 5 => "しかご",        // | で複数のパターン
        6..=10 => "むずかしい",    // 範囲パターン
        _ => "その他",            // _ は「それ以外すべて」
    };
    println!("{n} は {name}");
}
  • match n { パターン => 値, ... } … 上から順に照合し、最初に一致した腕(arm)の値になります。matchなので代入できます。
  • 4 | 5 … 複数のパターンをまとめる。6..=10 … 範囲。
  • _ … ワイルドカード(「その他すべて」)。
  • 網羅性チェックmatch は「起こりうるすべての場合を尽くしているか」をコンパイラが検査します。_ を消して一部のケースを書き忘れると、non-exhaustive patterns(パターンが網羅されていない)とコンパイルエラーになります。

この「網羅性チェック」が match の真価です。たとえば後で enum(列挙型)を扱うとき、新しい種類を追加したのに処理を書き忘れると、コンパイラが漏れを指摘してくれます。「対応漏れによるバグ」を仕組みで潰せるのです。

試すには

match n { 1 => "いち", 2 => "に" } のように _ も他の値も書かずに整数を照合すると、「i32 のすべての値を尽くしていない」とエラーになります。_ => "その他" を足すと解決します。網羅性の強制を体験してみましょう。

実際に動かしてみよう

下のエディタにRustを書いて「実行」を押すと、学習用シミュレータが println! の出力を表示します(本物のrustcではなく、教材の範囲を再現した軽量エンジンです)。struct・enum・match・トレイト・Vec/String/HashMap・Option/Result なども動きます。本文の例を書き換えて動かしてみましょう(所有権・借用チェッカーのコンパイルエラーは再現しないため、動きの確認用として使ってください)。

Rust — ブラウザ内で実行(学習用シミュレータ)

Rustの教材サブセットを動かす学習用シミュレータを読み込みます(本物のrustcではなく、動きを再現した軽量な自作エンジンです)。
スクロールして表示された時点でも自動で読み込まれます。