0Pricing
Learn Rust Coding · レッスン

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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 最初のenumを定義する
  2. enumのバリアントをmatchする
  3. データを持つenum
  4. matchガードとバインディング
← Learn Rust Codingに戻る