match

match は、値を1つ以上の選択肢と照合するために使用できます:

// Copyright 2024 Google LLC
// SPDX-License-Identifier: Apache-2.0

fn main() {
    let val = 1;
    match val {
        1 => println!("one"),
        10 => println!("ten"),
        100 => println!("one hundred"),
        _ => {
            println!("something else");
        }
    }
}

if 式と同様に、match も値を返すことができます。

// Copyright 2024 Google LLC
// SPDX-License-Identifier: Apache-2.0

fn main() {
    let flag = true;
    let val = match flag {
        true => 1,
        false => 0,
    };
    println!("The value of {flag} is {val}");
}
  • match のアームは上から下へ順に評価され、一致した最初のものに 対応する本体が実行されます。

  • 他の言語の switch のようなケース間のフォールスルーは ありません。

  • match アームの本体は、単一の式にもブロックにもできます。厳密には ブロックも式であるためこれは同じことですが、現時点では受講者は その対称性をまだ完全には理解していないかもしれません。

  • match 式は網羅的である必要があります。つまり、すべての可能な値を カバーするか、_ のようなデフォルトケースを持つ必要があります。 網羅性は列挙型で示すのが最も簡単ですが、列挙型はまだ導入されて いません。代わりに、最も単純なプリミティブ型である bool に対する マッチを示しています。

  • このスライドでは、パターンマッチについて触れずに match を紹介し、 受講者が最初から情報を詰め込みすぎることなく構文に慣れる機会を 与えています。パターンマッチについては明日より詳しく扱うので、 ここではあまり詳しく立ち入らないようにしてください。

さらに探る

  • match を使う動機をさらに示すために、これらの例を if で書いた 等価なコードと比較できます。2つ目の例では、bool に対するマッチは、 if {} else {} ブロックとかなり似ています。しかし、複数のケースを 調べる最初の例では、match 式のほうが if {} else if {} else if {} else より簡潔に書けます。

  • match はマッチガードもサポートしており、これにより任意の 論理条件を追加して、その match アームを選択すべきかどうかを 評価できます。ただし、マッチガードを説明するにはパターン マッチについて説明する必要があり、このスライドではそれを避けたいと 考えています。