0Pricing
Learn Rust Coding · レッスン

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

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

  1. match徹底解説
  2. if letとwhile let
  3. @による束縛
  4. 分解
← Learn Rust Codingに戻る