はじめに
この実験では、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 でさらに多くの実験を練習できます。