使用 if let 的简洁控制流

该语法允许您将 and 组合成一种不太详细的方式 处理与一个模式匹配的值,同时忽略其余模式。考虑一下 程序,它与变量中的值匹配,但只想在值是 variable 时执行代码。if letifletOption<u8>config_maxSome

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 时)

如果值为 ,我们通过绑定 模式中变量的值。我们不想做任何事情 替换为值。为了满足表达式,我们必须在处理一个变体后添加,这是令人讨厌的样板代码 加。SomeSomemaxNonematch_ => ()

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

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

语法采用模式和表达式,以等号分隔 标志。它的工作方式与 a 相同,其中表达式被赋予 the,模式是它的第一个分支。在这种情况下,模式为 ,并且 绑定到 .然后我们可以 在块体中使用的方式与我们在 相应的 Arm 进行如果 value 与模式不匹配。if letmatchmatchSome(max)maxSomemaxif letmaxmatchif let

使用意味着更少的键入、更少的缩进和更少的样板代码。 但是,您将失去强制执行的详尽检查。选择 between 和 取决于您在特定 情况,以及是否适合 丢失详尽的检查。if letmatchmatchif let

换句话说,你可以把 a 的语法糖看作是 that 当值与一个模式匹配时运行代码,然后忽略所有其他值。if letmatch

我们可以包含 an 和 .与 the 对应的代码块与表达式中与 case 一起对应的代码块相同,等效于 and 。回想一下示例 6-4 中的 enum 定义,其中 variant 也包含一个值。如果我们想计算所有非 25 美分硬币,我们会看到 while 宣布 Quarters 的状态时,我们可以使用表达式来实现,如下所示:elseif letelse_matchif letelseCoinQuarterUsStatematch

#[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,
    }
}

或者我们可以使用 and 表达式,如下所示: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 使用 a ,请记住,它也在你的 Rust 工具箱中。matchif let

总结

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

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

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

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