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アームを選択すべきかどうかを 評価できます。ただし、マッチガードを説明するにはパターン マッチについて説明する必要があり、このスライドではそれを避けたいと 考えています。