Matching Values

match キーワードを使用すると、1 つ以上のパターンに対して値を照合できます。上から順に照合が行われ、最初に一致したパターンのみが実行されます。

C や C++ の switch と同様に、パターンには単純な値を指定できます。

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

The _ pattern is a wildcard pattern which matches any value. The expressions must be exhaustive, meaning that it covers every possibility, so _ is often used as the final catch-all case.

一致を式として使用できます。if と同様に、各マッチアームは同じ型にする必要があります。型は、ブロックの最後の式です(存在する場合)。上記の例では、型は () です。

パターンの変数(この例では key)により、マッチアーム内で使用できるバインディングが作成されます。

マッチガードにより、条件が true の場合にのみアームが一致します。

Speaker Notes

This slide should take about 10 minutes.

キーポイント:

  • 特定の文字がパターンでどのように使用されるかを説明します。

    • |or として指定する
    • .. は必要に応じて展開できる
    • 1..=5 は 5 を含む範囲を表す
    • _ はワイルドカードを表す
  • パターンのみでは表現できない複雑な概念を簡潔に表現したい場合、独立した構文機能であるマッチガードは重要かつ必要です。

  • マッチガードは、マッチアーム内の個別の if 式とは異なります。分岐ブロック内(=> の後)の if 式は、マッチアームが選択された後に実行されます。そのブロック内で if 条件が満たされなかった場合、元の match 式の他のアームは考慮されません。

  • ガードで定義された条件は、| が付いたパターン内のすべての式に適用されます。

More To Explore

  • Another piece of pattern syntax you can show students is the @ syntax which binds a part of a pattern to a variable. For example:

    #![allow(unused)] fn main() { let opt = Some(123); match opt { outer @ Some(inner) => { println!("outer: {outer:?}, inner: {inner}"); } None => {} } }

    In this example inner has the value 123 which it pulled from the Option via destructuring, outer captures the entire Some(inner) expression, so it contains the full Option::Some(123). This is rarely used but can be useful in more complex patterns.