0Pricing
Learn Rust Coding · レッスン

enumのバリアントをmatchする

matchを使って各ケースを処理します。

「enumのバリアントをmatchする」はCoddyKit上の無料Learn Rust Codingレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLearn Rust Coding学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Learn Rust Codingコースには全4レッスンが含まれています。

match式に出会う

match式は、値を一連のパターンと比較し、最初に一致したパターンのコードを実行します。

enumと自然に組み合わせられ、各バリアントをそれぞれのアームで処理できます。

enum Light {
    Red,
    Green,
}

fn action(l: Light) {
    match l {
        Light::Red => println!("Stop"),
        Light::Green => println!("Go"),
    }
}

matchアームの構造

各アームはpattern => expressionという形式で、アーム同士はカンマで区切ります。

パターンは照合する対象で、=>の後の式は一致したときに実行されます。ここでのパターンは1つのenumバリアントです。

match light {
    Light::Red => println!("Stop"),
    Light::Green => println!("Go"),
}

完全なmatchプログラム

信号機をmatchし、指示を表示する完全なプログラムを見てみましょう。

実行した後、main内のバリアントを変更して、別のアームが実行される様子を確認してみましょう。

enum TrafficLight {
    Red,
    Yellow,
    Green,
}

fn main() {
    let light = TrafficLight::Yellow;
    match light {
        TrafficLight::Red => println!("Stop"),
        TrafficLight::Yellow => println!("Slow down"),
        TrafficLight::Green => println!("Go"),
    }
}

matchは網羅的でなければならない

Rustでは、matchですべての可能なバリアントを網羅する必要があります。1つでも忘れると、プログラムはコンパイルできません。

これは強力な安全機能です。後から新しいバリアントを追加すると、それを処理する必要があるすべての場所をコンパイラーが知らせてくれます。

// This would FAIL to compile because
// the Green case is missing:
// match light {
//     Light::Red => println!("Stop"),
// }

_によるワイルドカード

すべてのバリアントを列挙したくない場合は、アンダースコア_をワイルドカードパターンとして使います。上で処理されなかったものすべてに一致します。

アームは順番に試されるため、最後に配置してください。

enum Coin {
    Penny,
    Nickel,
    Dime,
    Quarter,
}

fn main() {
    let c = Coin::Dime;
    match c {
        Coin::Penny => println!("1 cent"),
        _ => println!("Some other coin"),
    }
}

matchは値を返す

matchは式なので、変数に格納できる値を生成します。

すべてのアームは同じ型を返す必要があります。ここでは各アームの式の後にセミコロンがないことに注目してください。

enum Coin {
    Penny,
    Quarter,
}

fn main() {
    let coin = Coin::Quarter;
    let cents = match coin {
        Coin::Penny => 1,
        Coin::Quarter => 25,
    };
    println!("{} cents", cents);
}

複数行のアーム本体

アームは、波かっこ{ ... }で囲むことで複数の文を実行できます。

波かっこの中の最後の式が、そのアームの生成する値になります。

match light {
    Light::Red => {
        println!("Caution!");
        println!("Stop the car");
    }
    Light::Green => println!("Go"),
}

|によるパターンの組み合わせ

パイプ|を使うと、1つのアームで複数のバリアントに一致させられます。これは「または」を意味します。

同じように振る舞うバリアントの本体を繰り返さずに済みます。

enum Coin {
    Penny,
    Nickel,
    Dime,
    Quarter,
}

fn main() {
    let c = Coin::Nickel;
    match c {
        Coin::Penny | Coin::Nickel => println!("Small coin"),
        _ => println!("Bigger coin"),
    }
}

matchとif/elseの違い

if / else ifを連ねてバリアントを確認することもできますが、matchのほうが明確で安全です。

matchでは、すべてのケースを処理したかコンパイラーが検証します。if文の連鎖には、そのような保証はありません。

matchと表示を組み合わせる

よくあるパターンは、バリアントを分かりやすい文字列に変換して表示することです。

このプログラムを実行し、選択した方向を変更して、対応するメッセージを確認してみましょう。

enum Direction {
    North,
    South,
    East,
    West,
}

fn main() {
    let d = Direction::West;
    let name = match d {
        Direction::North => "North",
        Direction::South => "South",
        Direction::East => "East",
        Direction::West => "West",
    };
    println!("Heading {}", name);
}

順序が重要

アームは上から下へ確認され、最初に一致したものが選ばれます。残りはスキップされます。

そのため、ワイルドカード_は最後に置く必要があります。最初に置くと、具体的なアームが実行される前にすべての値を受け取ってしまいます。

簡単な確認

matchについて理解度を確認しましょう。

まとめ

matchは値をパターンと比較し、最初に一致したアームを実行するものだと学びました。

網羅的である必要があり、_をワイルドカードとして使えます。また、|でバリアントを組み合わせられます。式なので値も返します。次はenumの各バリアントに固有のデータを持たせます。

よくある質問

「enumのバリアントをmatchする」レッスンは無料ですか?

はい。「enumのバリアントをmatchする」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Learn Rust Codingコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Learn Rust Codingコースには全4レッスンが含まれています。

「enumのバリアントをmatchする」で何を学びますか?

matchを使って各ケースを処理します。 ブラウザで直接実行するハンズオンコードでLearn Rust Codingを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Learn Rust Codingを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのLearn Rust Codingは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「enumのバリアントをmatchする」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このLearn Rust Codingレッスンでコードを書いて実行できますか?

はい。すべてのLearn Rust Codingレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

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

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