Dev Study
← 解説「マッチガードと @ 束縛」に戻る

サンプルコードで身につける: マッチガードと @ 束縛

解説で学んだ概念を、5つの具体例で確認します。素朴な例から実務寄りの例へと進みます。

1マッチガードの最小例

パターンの後ろに if 条件を足すと、「負の数なら」のようにパターン単独では書けない条件で腕を絞り込めます。x if x < 0 の x には対象の値が束縛されるので、腕の中でそのまま使えます。if-else の連鎖で書くより、分岐の全体像が match に揃って見通しが良くなります。

Rust

2@ 束縛 — 範囲に一致した値を使う

1..=9 のような範囲パターンは一致するかの判定だけで値を捨ててしまいますが、x @ 1..=9 と書けば判定と同時に値を x へ束縛できます。「どの範囲に入ったか」と「実際の値はいくつか」の両方が欲しい分岐の定番です。桁数やランクのような数値の帯分けでよく使います。

Rust

3Option とガード — 外の変数で絞り込む

Some(n) if n <= limit のように、ガードの条件には match の外で定義した変数も使えます。enum のバリアント分解とガードを重ねると、「値があり、かつ条件を満たす」を1つの腕で表現できます。しきい値判定のような実務の分岐がネストなしで書けます。

Rust

4タプルとガード — 2つの値の関係で分岐

タプルパターンで2つの値を取り出し、ガードで a == b のような「値同士の関係」を条件にする例です。パターンは形の一致しか調べられないので、大小比較や等しさの判定はガードの担当になります。座標の比較や新旧の値の突き合わせなどで使う形です。

Rust

5HTTP ステータスの分類

ステータスコードの帯分け(2xx, 3xx, ...)を @ 束縛で、上限のない「500 以上」をガードで書き分けた実務寄りの例です。404 のような特定の値の腕を範囲の腕より上に置けば、特別扱いも自然に混ざります。ガード付きの腕は網羅性チェックに数えられないため、最後に code を受ける腕を置いています。

Rust