016、简单控制流if let

if let 能让我们通过一种不那么烦琐的语法结合使用 iflet ,并处理那些只用关心某一种匹配而忽略其他匹配的情况。思考一下 示例6-6 中的程序,它会匹配一个 Option<u8> 的值,并只在值为 3时执行代码。

rust 复制代码
// 示例6-6:这里的match只在值为Some(3)时执行特定的代码

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

我们想要对 Some(3) 的匹配执行某些操作,并忽略其他 Some<u8>None 值。为了满足 match 表达式穷尽性的需求,我们不得不在处理完这唯一的变体后额外加上一句 _ => (),这显得十分多余。

不过,我们可以使用 if let 以一种更加简短的方式实现这段代码。下面的代码与 示例6-6 中的 match拥有完全一致的行为:

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

这里的 if let 语法使用一对以 = 隔开的模式与表达式。它们所起的作用与 match 中的完全相同,表达式对应 match中的输入,而模式则对应第一个分支。

使用if let 意味着你可以编写更少的代码,使用更少的缩进,使用更少的模板代码。但是,你也放弃了 match所附带的穷尽性检查。

究竟应该使用 match 还是 if let 取决于你当时所处的环境,这是一个在代码简捷性与穷尽性检查之间取舍的过程。

换句话说,你可以将 if let 视作 match的语法糖。它只在值满足某一特定模式时运行代码,而忽略其他所有的可能性。

我们还可以在 if let 中搭配使用 elseelse 所关联的代码块在if let 语句中扮演的角色,就如同 match 中 **_**模式所关联的代码块一样。

还记得我们曾经在 示例6-4 中定义的 Coin 枚举吗?里面的 Quarter 变体包含了一个 UsState值。

假如我们想要在打印25美分硬币中的信息的同时,对处理过的所有非25美分的硬币进行计数,我们就可以像下面一样使用 match表达式:

rust 复制代码
let mut count = 0;
match coin {
    Coin::Quarter(state) => println!("State quarter from {:?}!", state),
    _ => count += 1,
}

或者我们可以像下面这样使用 if letelse表达式:

rust 复制代码
let mut count = 0;
if let Coin::Quarter(state) = coin {
    println!("State quarter from {:?}!", state);
} else {
    count += 1;
}

如果你在编写程序的过程中,觉得在某些情形下使用 match 会过分烦琐,要记得在Rust工具箱中还有if let的存在。

相关推荐
古方路杰出青年13 小时前
学习笔记:语音信号读取与显示——理论分析与技术详解(含代码块)
笔记·学习·语音识别
中屹指纹浏览器13 小时前
2026指纹浏览器缓存机制深挖:HTTP强缓存与协商缓存隐性风控陷阱
经验分享·笔记
Sean_VIP13 小时前
FreeRTOS项目程序框架介绍(五)
笔记·stm32
basketball61613 小时前
设计模式入门:2. 工厂模式详解 C++实现
开发语言·c++·设计模式
Lumbrologist13 小时前
【C++】零基础入门 · 第 16 节:智能指针
开发语言·c++
yu859395813 小时前
MATLAB 分支定界法(Branch and Bound)实现
开发语言·matlab
tealcwu13 小时前
【Unity实战】Unity IAP 5.3 中实现 Windows Custom Store 实战教程
windows·unity·游戏引擎
学会去珍惜13 小时前
c语言编程 C语言入门 c语言(C语言程序设计教程 c语言视频教程 c语言零基础
c语言·开发语言
AI 编程助手GPT13 小时前
ChatGPT 新手入门与实战操作指南
开发语言·人工智能·git·python·chatgpt
Brilliantwxx13 小时前
【C++】 红黑树封装 STL set/map 超详细解析
开发语言·c++