Rust - if let简单控制流

这是我参与11月更文挑战的第29天,活动详情查看:2021最后一次更文挑战

if let简单控制流

当我们只需要处理一种情况或者条件并且忽略其他情况时,if let的语法相对来说会比match更加的简洁,比如下述示例代码,希望当值为3的时候执行对应代码:

let some_u8_value = Some(0u8);
match some_u8_value {
    Some(3) => println!("three"),
    _ => (),
}
复制代码

想要对 Some(3) 匹配进行操作但是不想处理任何其他 Some<u8> 值或 None 值。为了满足 match 表达式(穷尽性)的要求,必须在处理完这唯一的成员后加上 _ => (),这样也要增加很多样板代码。

不过我们可以使用 if let 这种更短的方式编写,执行效果和match完全一致

if let Some(3) = some_u8_value {
    println!("three");
}
复制代码

if let的工作方式和match相同, 这里的表达式对应match中第一个分支。

使用 if let 意味着编写更少代码,更少的缩进和更少的样板代码。然而,这样会失去 match 强制要求的穷尽性检查。matchif let 之间的选择依赖特定的环境以及增加简洁度和失去穷尽性检查的权衡取舍。

可以在 if let 中包含一个 elseelse 块中的代码与 match 表达式中的 _ 分支块中的代码相同,这样的match 表达式在某种角度说就等同于 if letelse

比如下述代码示例,比如说u8得范围是0-255,如果我们只关心1、3、5 和 7 这几个值,而且并不想必须列出 0、2、4、6、8、9 一直到 255 的值。

使用match表达式:

fn main() {
let some_u8_value = 0u8;
match some_u8_value {
    1 => println!("one"),
    _ => (),
}
}
复制代码

我们也可以使用if letelse表达式:

let some_u8_value = Some(0u8);
if let Some(1) = some_u8_value {
    println!("one");
} else {
    println!("我只要1,你们都不行")
}
复制代码

如果你的程序遇到一个使用 match 表达起来过于啰嗦的逻辑,记住 if let 绝对是一个非常好的选择。

扫描二维码关注公众号,回复: 13462954 查看本文章

总结

现在我们涉及到了如何使用枚举来创建有一系列可列举值的自定义类型。我们也展示了标准库的 Option<T> 类型是如何帮助你利用类型系统来避免出错的。当枚举值包含数据时,可以根据需要处理多少情况来选择使用 matchif let 来获取并使用这些值。

Rust 程序基于现在的知识能够使用结构体和枚举在自己的作用域内发挥起作用。

在接下来的文章中作者会介绍Rust的下一部分知识-模块系统,一起来康康吧~

结语

文章首发于微信公众号程序媛小庄,同步于掘金

码字不易,转载请说明出处,走过路过的小伙伴们伸出可爱的小指头点个赞再走吧(╹▽╹)

猜你喜欢

转载自juejin.im/post/7035889758383374366