Rust のマッチガードの使用方法

Beginner

This tutorial is from open-source community. Access the source code

はじめに

この実験では、Rust でマッチガードを使って条件に基づいてアームをフィルタリングする方法を学びます。マッチガードはパターンの後に追加され、条件を表す if キーワードで表されます。ガード条件により、パターンのマッチングをさらに微調整し、マッチ式の対応するアームを実行する前に追加のチェックを行うことができます。ただし、コンパイラはパターンのカバレッジをチェックする際にガード条件を考慮しないため、マッチ式によってすべてのパターンが依然としてカバーされることを確認する必要があります。

注: 実験でファイル名が指定されていない場合は、好きなファイル名を使用できます。たとえば、main.rs を使用して、rustc main.rs &&./main でコンパイルして実行することができます。

ガード

アームをフィルタリングするために matchガード を追加できます。

#[allow(dead_code)]
enum Temperature {
    Celsius(i32),
    Fahrenheit(i32),
}

fn main() {
    let temperature = Temperature::Celsius(35);
    // ^ `temperature` に対して異なる値を試してみてください
    match temperature {
        Temperature::Celsius(t) if t > 30 => println!("{}C は摂氏 30 度を超えています", t),
        // `if condition` の部分 ^ がガードです
        Temperature::Celsius(t) => println!("{}C は摂氏 30 度未満です", t),
        Temperature::Fahrenheit(t) if t > 86 => println!("{}F は華氏 86 度を超えています", t),
        Temperature::Fahrenheit(t) => println!("{}F は華氏 86 度未満です", t),
    }
}

マッチ式によってすべてのパターンがカバーされているかどうかをチェックする際に、コンパイラはガード条件を考慮しません。

fn main() {
    let number: u8 = 4;
    match number {
        i if i == 0 => println!("Zero"),
        i if i > 0 => println!("Greater than zero"),
        // _ => unreachable!("Should never happen."),
        // TODO ^ これをコメントアウトしてコンパイルを修正してください
    }
}

まとめ

おめでとうございます!あなたはガードの実験を完了しました。あなたの技術を向上させるために、LabEx でさらに多くの実験を練習できます。