Rust之枚举和模式匹配(三):简明控制流if let

开发环境

  • Windows 10
  • Rust 1.60.0

 

  •  VS Code 1.66.2 

Rust之枚举和模式匹配(三):简明控制流if let_第1张图片

 项目工程

这里继续沿用上次工程rust-demo

简明控制流 - if let

if let语法允许您将iflet组合成一种不太冗长的方式来处理匹配一个模式的值,而忽略其余的模式。考虑下面示例中,它匹配config_max变量中的一个Option值,但是如果这个值是Some变量,它只想执行代码。

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

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

相反,我们可以用if let以更短的方式来写。以下代码与上例的匹配行为相同:

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

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

使用if let意味着更少的输入、更少的缩进和更少的样板代码。但是,您会失去match强制执行的详尽检查。在matchif let之间进行选择取决于您在特定情况下正在做什么,以及获得简明性是否是失去彻底检查的适当折衷。

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

我们可以在if let中包含else。与else一起使用的代码块与与if letelse等价的匹配表达式中的_ 分支一起使用的代码块是相同的。回想一下之前示例中的Coin枚举定义,其中Quarter变量也包含一个UsState值。如果我们想计算我们看到的所有non-quarter硬币,同时宣布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 {                   // match表达式
        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 {               // if let表达式
        println!("State quarter from {:?}!", state);
    } else {
        count += 1;
    }
}

编译

cargo run

 Rust之枚举和模式匹配(三):简明控制流if let_第2张图片

如果你的程序逻辑过于冗长,无法用匹配来表达,请记住,if let也在你的Rust工具箱中。

总结 

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

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

本章重点

  • match使用
  • if let使用
  • if let使用场景

你可能感兴趣的:(Rust,rust)