简介
在本实验中,我们将学习如何在 Rust 中使用匹配守卫(match guard)根据条件来过滤分支。匹配守卫添加在模式之后,由 if 关键字后跟一个条件表示。守卫条件使我们能够进一步细化模式匹配,并在执行匹配表达式的相应分支之前执行额外的检查。但是,需要注意的是,编译器在检查模式覆盖范围时不会考虑守卫条件,因此有必要确保匹配表达式仍然覆盖所有模式。
注意:如果实验未指定文件名,你可以使用任何你想要的文件名。例如,你可以使用
main.rs,并通过rustc main.rs &&./main进行编译和运行。
守卫
可以添加一个 match 守卫 来过滤分支。
#[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!("{}摄氏度高于 30 摄氏度", t),
// `if condition` 部分 ^ 是一个守卫
Temperature::Celsius(t) => println!("{}摄氏度低于 30 摄氏度", t),
Temperature::Fahrenheit(t) if t > 86 => println!("{}华氏度高于 86 华氏度", t),
Temperature::Fahrenheit(t) => println!("{}华氏度低于 86 华氏度", t),
}
}
请注意,在检查匹配表达式是否覆盖了所有模式时,编译器不会考虑守卫条件。
fn main() {
let number: u8 = 4;
match number {
i if i == 0 => println!("零"),
i if i > 0 => println!("大于零"),
// _ => unreachable!("Should never happen."),
// TODO ^ 取消注释以修复编译
}
}
总结
恭喜你!你已经完成了“守卫”实验。你可以在 LabEx 中练习更多实验来提升你的技能。