使用 Rust 匹配守卫

Beginner

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

简介

在本实验中,我们将学习如何在 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 中练习更多实验来提升你的技能。