【Rust学习】06_3 if let简单控制流

前言

在这一章我们将开始if let的学习,if let 语法允许您将 iflet 组合成一种不太冗长的方式,以处理与一个模式匹配的值,同时忽略其余模式,现在让我们开始学习吧。

内容

现在让我们写一个代码,它与 config_max 变量中的 Option<u8> 值匹配,但只在值为 Some 成员时执行代码。

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

如果值为 Some,我们通过将值绑定到模式中的变量 max 来打印出 Some 成员中的值。我们不想对 None 值执行任何操作。为了满足 match 表达式,我们必须在只处理一个成员后添加 _ => (),这是很烦人的样板代码。

相反,我们可以使用 if let 以更短的方式编写它。以下代码的行为与上面中的 match 相同:

#![allow(unused)]
fn main() {
  let some_u8_value = Some(0u8);
  if let Some(3) = some_u8_value {
      println!("three");
  }
}

语法 if let 采用模式和表达式,以等号分隔。它的工作方式与 match 相同,其中表达式给出了匹配,模式是它的第一个分支。在这种情况下,模式是 Some(max),并且 max 绑定到 Some 中的值。然后,我们可以在 if let 块的主体中使用 max,就像我们在相应的 match 分支中使用 max 一样。如果值与模式不匹配,则 if let 块中的代码不会运行。

使用 if let 意味着更少的键入、更少的缩进和更少的样板代码。但是,您将失去 match 强制要求的穷尽性检查。在 matchif let 之间进行选择取决于您在特定情况下执行的操作,以及获得简洁性和是否是失去穷尽性检查的权衡。

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

我们可以在 if let 中包含 else。与 else 一起使用的代码块与 match 表达式中与 _ 写一起使用的代码块相同,等效于 if letelse。回想一下在match控制流示例中的 Coin 枚举定义,其中 Quarter 成员也包含一个 UsState 值。如果我们想计算我们看到的所有非 25 美分硬币,同时宣布 25 美分硬币的状态,我们可以使用 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;
    }
}

如果你的情况是你的程序的逻辑太冗长而无法使用 match 来表示,请记住 if let 也在你的 Rust 工具箱中。

总结

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

您的 Rust 程序现在可以使用结构和枚举来表达作用域中的概念。创建要在 API 中使用的自定义类型可确保类型安全:编译器将确保您的函数仅获取每个函数期望的值。

为了给你的用户提供一个组织良好的 API,它易于使用,并且只公开你的用户需要的东西,现在让我们转向 Rust 的模块。

posted @ 2024-11-12 17:15:07 王洋 阅读(77) 评论(2)

  1. #1楼 2024-11-19 18:40 xiwiugsqpb Windows 10.0 Sogou 2.X 美国 纽约 纽约


    你的文章让我感受到了不一样的视角,非常精彩。 http://www.55baobei.com/HlD3UivqZc.html

  2. #2楼 2024-11-14 23:06 kbwrjarhcg Windows 10.0 Sogou 2.X 美国 纽约 纽约


    你的文章充满了智慧,让人敬佩。 http://www.55baobei.com/FMhWAvsqkP.html

发表评论
昵称
邮箱
网址