Введение
В этом лабе мы узнаем, как использовать match guards в Rust для фильтрации ветвей на основе условий. Match guard добавляется после шаблона и представляется ключевым словом if, за которым следует условие. Условие guard позволяет нам дополнительно уточнить сопоставление шаблонов и выполнить дополнительные проверки перед выполнением соответствующей ветви match-выражения. Однако важно помнить, что компилятор не учитывает условия guard при проверке покрытия шаблонов, поэтому необходимо убедиться, что все шаблоны по-прежнему покрываются match-выражением.
Примечание: Если в лабе не указано имя файла, вы можете использовать любое имя файла, которое хотите. Например, вы можете использовать
main.rs, скомпилировать и запустить его с помощьюrustc main.rs &&./main.
Guards
Можно добавить match guard, чтобы отфильтровать ветвь.
#[allow(dead_code)]
enum Temperature {
Celsius(i32),
Fahrenheit(i32),
}
fn main() {
let temperature = Temperature::Celsius(35);
// ^ TODO попробуйте разные значения для `temperature`
match temperature {
Temperature::Celsius(t) if t > 30 => println!("{}C is above 30 Celsius", t),
// Часть `if condition` ^ - это guard
Temperature::Celsius(t) => println!("{}C is below 30 Celsius", t),
Temperature::Fahrenheit(t) if t > 86 => println!("{}F is above 86 Fahrenheit", t),
Temperature::Fahrenheit(t) => println!("{}F is below 86 Fahrenheit", t),
}
}
Обратите внимание, что компилятор не будет учитывать условия guard при проверке, покрываются ли все шаблоны match-выражением.
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 ^ раскомментируйте, чтобы исправить компиляцию
}
}
Резюме
Поздравляем! Вы завершили лабу по Guards. Вы можете практиковаться в других лабах в LabEx, чтобы улучшить свои навыки.