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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 最初のenumを定義する
- enumのバリアントをmatchする
- データを持つenum
- matchガードとバインディング