简洁的控制流if let

if letsyntax 允许您组合iflet转换为一种不那么冗长的方式 处理与一个模式匹配的值,同时忽略其余模式。考虑一下 程序中,它与Option<u8>值在config_max变量,但只想在值为Some变体。

fn main() {
    let config_max = Some(3u8);
    match config_max {
        Some(max) => println!("The maximum is configured to be {max}"),
        _ => (),
    }
}

示例 6-6:一个match只关心执行 code (当值为Some

如果值为Some,我们打印出Somevariant by binding 变量的值max在模式中。我们不想做任何事情 使用None价值。为了满足match表达式,我们只需要在处理一个变体后添加,这是令人讨厌的样板代码 加。_ => ()

相反,我们可以使用if let.以下内容 code 的行为与match在示例 6-6 中:

fn main() {
    let config_max = Some(3u8);
    if let Some(max) = config_max {
        println!("The maximum is configured to be {max}");
    }
}

语法if let采用模式和表达式,由等号 标志。它的工作方式与match,其中表达式被赋予match而 pattern 是它的第一只手臂。在本例中,模式为Some(max)max绑定到Some.然后我们可以 用maxif let块,就像我们使用的一样max在 相应的match手臂。代码中的if letblock 不会运行 value 与模式不匹配。

if let意味着更少的键入、更少的缩进和更少的样板代码。 但是,您失去了详尽的检查match执行。选择 之间matchif let取决于您在特定 情况,以及是否适合 丢失详尽的检查。

换句话说,您可以想到if let作为语法 sugar 为match那 当值与一个模式匹配时运行代码,然后忽略所有其他值。

我们可以包含一个else替换为if let.与else与 Case 中的 case 对应的代码块相同_match表达式,该表达式等效于if letelse.回想一下Coinenum 定义,其中Quarter变体还持有UsState价值。如果我们想计算所有非 25 美分硬币,我们会看到 while 宣布 Quarters 的状态时,我们可以使用match表达式,如下所示:

#[derive(Debug)]
enum UsState {
    Alabama,
    Alaska,
    // --snip--
}

enum Coin {
    Penny,
    Nickel,
    Dime,
    Quarter(UsState),
}

fn main() {
    let coin = Coin::Penny;
    let mut count = 0;
    match coin {
        Coin::Quarter(state) => println!("State quarter from {state:?}!"),
        _ => count += 1,
    }
}

或者我们可以使用if letelse表达式,如下所示:

#[derive(Debug)]
enum UsState {
    Alabama,
    Alaska,
    // --snip--
}

enum Coin {
    Penny,
    Nickel,
    Dime,
    Quarter(UsState),
}

fn main() {
    let coin = Coin::Penny;
    let mut count = 0;
    if let Coin::Quarter(state) = coin {
        println!("State quarter from {state:?}!");
    } else {
        count += 1;
    }
}

如果程序的逻辑过于冗长,无法 express 使用match,请记住if let也在您的 Rust 工具箱中。

总结

我们现在已经介绍了如何使用枚举创建自定义类型,这些类型可以是 枚举值集。我们已经展示了标准库的Option<T>type 可帮助您使用 type 系统来防止错误。当枚举值具有 data 中,你可以使用matchif let提取并使用这些 值,具体取决于您需要处理多少个案例。

您的 Rust 程序现在可以使用 structs 和 枚举。创建要在 API 中使用的自定义类型可确保类型安全: compiler 将确保您的函数只获取每个 function 期望。

为了向您的用户提供一个组织良好的 API,这很简单 要使用并且只公开您的用户将需要的内容,现在让我们转向 Rust 的模块。

本文档由官方文档翻译而来,如有差异请以官方英文文档(https://doc.rust-lang.org/)为准