使用 if let
的简洁控制流
该语法允许您将 and 组合成一种不太详细的方式
处理与一个模式匹配的值,同时忽略其余模式。考虑一下
程序,它与变量中的值匹配,但只想在值是 variable 时执行代码。if let
if
let
Option<u8>
config_max
Some
fn main() { let config_max = Some(3u8); match config_max { Some(max) => println!("The maximum is configured to be {max}"), _ => (), } }
如果值为 ,我们通过绑定
模式中变量的值。我们不想做任何事情
替换为值。为了满足表达式,我们必须在处理一个变体后添加,这是令人讨厌的样板代码
加。Some
Some
max
None
match
_ => ()
相反,我们可以使用 .以下内容
code 的行为与示例 6-6 中的 相同:if let
match
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 let
match
match
Some(max)
max
Some
max
if let
max
match
if let
使用意味着更少的键入、更少的缩进和更少的样板代码。
但是,您将失去强制执行的详尽检查。选择
between 和 取决于您在特定
情况,以及是否适合
丢失详尽的检查。if let
match
match
if let
换句话说,你可以把 a 的语法糖看作是 that
当值与一个模式匹配时运行代码,然后忽略所有其他值。if let
match
我们可以包含 an 和 .与 the 对应的代码块与表达式中与 case 一起对应的代码块相同,等效于 and 。回想一下示例 6-4 中的 enum 定义,其中 variant 也包含一个值。如果我们想计算所有非 25 美分硬币,我们会看到 while
宣布 Quarters 的状态时,我们可以使用表达式来实现,如下所示:else
if let
else
_
match
if let
else
Coin
Quarter
UsState
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, } }
或者我们可以使用 and 表达式,如下所示:if let
else
#[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 工具箱中。match
if let
总结
我们现在已经介绍了如何使用枚举创建自定义类型,这些类型可以是
枚举值集。我们已经展示了标准库的类型如何帮助您使用类型系统来防止错误。当枚举值具有
数据,您可以使用 OR 来提取和使用这些数据
值,具体取决于您需要处理多少个案例。Option<T>
match
if let
您的 Rust 程序现在可以使用 structs 和 枚举。创建要在 API 中使用的自定义类型可确保类型安全: compiler 将确保您的函数只获取每个 function 期望。
为了向您的用户提供一个组织良好的 API,这很简单 要使用并且只公开您的用户将需要的内容,现在让我们转向 Rust 的模块。
本文档由官方文档翻译而来,如有差异请以官方英文文档(https://doc.rust-lang.org/)为准