match徹底解説
パターンとガード
「match徹底解説」はCoddyKit上の無料Learn Rust Codingレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLearn Rust Coding学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Learn Rust Codingコースには全4レッスンが含まれています。
match 式
match は値を一連のパターンと比較し、最初に一致したアームを実行します。式なので、値を返します。
fn main() {
let n = 3;
let label = match n {
1 => "one",
2 => "two",
3 => "three",
_ => "many",
};
println!("{label}");
}網羅性
match では、考えられるすべての値を扱う必要があります。ワイルドカード _ は、前のアームに一致しなかったすべての値を受け取り、網羅性を保証します。
fn main() {
let x = 42;
match x {
0 => println!("zero"),
_ => println!("nonzero"),
}
}複数の値とのマッチング
| を使うと、1つのアームで複数のパターンにマッチできます。
fn main() {
let c = 'e';
match c {
'a' | 'e' | 'i' | 'o' | 'u' => println!("vowel"),
_ => println!("consonant"),
}
}範囲パターン
..=(両端を含む)を使うと、値の範囲にマッチできます。数値や文字をまとめて扱うのに便利です。
fn main() {
let score = 85;
let grade = match score {
90..=100 => 'A',
80..=89 => 'B',
70..=79 => 'C',
_ => 'F',
};
println!("Grade: {grade}");
}マッチガード
ガードは、アームに追加する if 条件です。パターンに一致し、かつガードが true の場合にだけ、そのアームが選ばれます。
fn main() {
let pair = (2, -2);
match pair {
(x, y) if x + y == 0 => println!("sum is zero"),
(x, _) if x % 2 == 0 => println!("first is even"),
_ => println!("no rule"),
}
}パターンでのバインド
パターンでは、一致した部分を変数にバインドして、アーム本体で利用できます。
fn main() {
let msg = Some(7);
match msg {
Some(n) => println!("got {n}"),
None => println!("nothing"),
}
}列挙型とのマッチング
match は、特にバリアントがデータを持つ場合に、列挙型との組み合わせで力を発揮します。
enum Shape {
Circle(f64),
Rectangle(f64, f64),
}
fn area(s: Shape) -> f64 {
match s {
Shape::Circle(r) => 3.14159 * r * r,
Shape::Rectangle(w, h) => w * h,
}
}
fn main() {
println!("{}", area(Shape::Rectangle(3.0, 4.0)));
}_ と .. による無視
_ で単一の値を無視し、.. でタプルまたは構造体の残りを無視します。
fn main() {
let triple = (1, 2, 3);
match triple {
(first, ..) => println!("first is {first}"),
}
}match からの返却
match は式なので、結果を代入したり、直接返したりできます。すべてのアームは同じ型の値を生成する必要があります。
fn describe(n: i32) -> &'static str {
match n.cmp(&0) {
std::cmp::Ordering::Less => "negative",
std::cmp::Ordering::Equal => "zero",
std::cmp::Ordering::Greater => "positive",
}
}
fn main() {
println!("{}", describe(-5));
}アームの順序が重要
アームは上から下へ確認され、最初に一致したものが選ばれます。具体的なパターンを一般的なパターンより先に置き、ワイルドカードは最後に置いてください。
@ による範囲のバインド
範囲と @ 演算子を組み合わせると、値を検査しながら、同じアーム内でその正確な内容を保持できます。
fn main() {
let n = 42;
match n {
small @ 0..=9 => println!("single digit: {small}"),
big @ 10..=99 => println!("two digits: {big}"),
_ => println!("large"),
}
}確認問題
(x, y) if x > y のようなマッチガードには、どのような目的がありますか?
まとめ
match について詳しく学びました。
- 網羅的に値を返す式である
|で複数のパターンに、..=で範囲にマッチできる- ガードで追加の
if条件を指定できる - パターンでデータをバインドし、
_と..で部分を無視できる - アームの順序が重要で、最初に一致したものが選ばれる
よくある質問
「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は初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「match徹底解説」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このLearn Rust Codingレッスンでコードを書いて実行できますか?
はい。すべてのLearn Rust Codingレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- match徹底解説
- if letとwhile let
- @による束縛
- 分解