導入
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 のすべての値を尽くしていない」とエラーになります。_ => "その他" を足すと解決します。網羅性の強制を体験してみましょう。