matchガードとバインディング
条件を追加し、値を取り出します。
「matchガードとバインディング」はCoddyKit上の無料Learn Rust Codingレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLearn Rust Coding学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Learn Rust Codingコースには全4レッスンが含まれています。
マッチガードとは
マッチガードとは、matchアームに追加するif条件です。パターンが一致し、かつ条件がtrueの場合にだけ、そのアームが実行されます。
これにより、データに基づいて1つのバリアントをより細かいケースに分けられます。
match number {
Some(n) if n > 0 => println!("positive"),
Some(n) => println!("zero or negative"),
None => println!("no number"),
}ガードの構文
パターン、if condition、=>の順に記述します。条件では、パターンによってバインドされた任意の変数を使えます。
ガードがfalseの場合、Rustは次のアームを試します。
fn main() {
let n = 4;
match n {
x if x % 2 == 0 => println!("even"),
_ => println!("odd"),
}
}列挙型のデータに対するガード
ガードは、データを保持する列挙型で特に役立ちます。内部の値をバインドしてから、それをテストします。
ここでは、どちらも同じバリアントですが、正の残高と負の残高に異なるメッセージを表示します。
enum Account {
Balance(i32),
Closed,
}
fn main() {
let a = Account::Balance(-5);
match a {
Account::Balance(b) if b < 0 => println!("overdrawn"),
Account::Balance(b) => println!("balance {}", b),
Account::Closed => println!("closed"),
}
}順序が重要
アームは上から下へ試されるため、より具体的なガード付きアームを一般的なアームより前に置きます。
通常のBalance(b)アームを先に置くと、すべてに一致するため、ガード付きアームは決して実行されません。
リテラル値のマッチング
ガードを使わず、パターン内で特定のリテラルに直接マッチさせることもできます。
ここでは0と1に正確にマッチし、_でそれ以外を処理します。
fn main() {
let n = 1;
match n {
0 => println!("zero"),
1 => println!("one"),
_ => println!("many"),
}
}範囲のマッチング
パターンでは、..=を使って値の範囲にマッチできます。両端を含む範囲です。
複数の比較ガードを使う代わりに、すっきり記述できます。
fn main() {
let score = 85;
match score {
0..=59 => println!("fail"),
60..=100 => println!("pass"),
_ => println!("out of range"),
}
}@演算子によるバインディング
@演算子を使うと、値をパターンと照合しながら、同時に名前へバインドできます。
ここでのid @ 1..=5は範囲を確認し、実際の値をidに格納するため、値を表示できます。
fn main() {
let n = 3;
match n {
id @ 1..=5 => println!("small id {}", id),
other => println!("other {}", other),
}
}値全体のバインディング
上のotherのように、パターン内に単独で名前を書くと、値全体がバインドされます。これは、後から利用できるキャッチオールとして機能します。
値を無視したい場合は_を使い、必要な場合は名前を使います。
fn main() {
let n = 99;
match n {
0 => println!("zero"),
value => println!("got {}", value),
}
}ガードとバインディングの組み合わせ
バインディングとガードを組み合わせることで、細かく制御できます。データをバインドしてから、条件を追加します。
このプログラムでは、大きくて偶数の残高を特別に扱います。
enum Account {
Balance(i32),
}
fn main() {
let a = Account::Balance(200);
match a {
Account::Balance(b) if b > 100 && b % 2 == 0 => println!("big even {}", b),
Account::Balance(b) => println!("normal {}", b),
}
}複数のパターンに対するガード
アームで|を使ってパターンを組み合わせている場合でも、ガードはアーム全体に適用されます。
列挙されたパターンのいずれかに一致した後で、条件が確認されます。
fn main() {
let n = 6;
match n {
2 | 4 | 6 if n > 3 => println!("big even"),
_ => println!("other"),
}
}組み合わせる
この最後のプログラムでは、データを持つバリアント、バインディング、ガード、キャッチオールを組み合わせて、温度の値を分類します。
値を変更して再実行し、異なるアームが実行される様子を確認してください。
enum Reading {
Temp(i32),
Missing,
}
fn main() {
let r = Reading::Temp(38);
match r {
Reading::Temp(t) if t >= 38 => println!("fever: {}", t),
Reading::Temp(t) => println!("normal: {}", t),
Reading::Missing => println!("no reading"),
}
}簡単な確認
ガードとバインディングについての理解を確認しましょう。
まとめ
ガード(pattern if condition)でマッチを細かくし、リテラルと範囲(..=)にマッチし、名前または@演算子でバインディングを作成する方法を学びました。
これまでの内容と組み合わせることで、状態の固定された集合をモデル化し、データを関連付け、それぞれのケースに正確に対応できるようになりました。列挙型とmatchの学習、お疲れさまでした。
よくある質問
「matchガードとバインディング」レッスンは無料ですか?
はい。「matchガードとバインディング」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Learn Rust Codingコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Learn Rust Codingコースには全4レッスンが含まれています。
「matchガードとバインディング」で何を学びますか?
条件を追加し、値を取り出します。 ブラウザで直接実行するハンズオンコードでLearn Rust Codingを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Learn Rust Codingを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのLearn Rust Codingは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「matchガードとバインディング」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このLearn Rust Codingレッスンでコードを書いて実行できますか?
はい。すべてのLearn Rust Codingレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 最初のenumを定義する
- enumのバリアントをmatchする
- データを持つenum
- matchガードとバインディング