简洁的控制流if let
这if let
syntax 允许您组合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}"), _ => (), } }
示例 6-6:一个match
只关心执行
code (当值为Some
如果值为Some
,我们打印出Some
variant by binding
变量的值max
在模式中。我们不想做任何事情
使用None
价值。为了满足match
表达式,我们只需要在处理一个变体后添加,这是令人讨厌的样板代码
加。_ => ()
相反,我们可以使用if let
.以下内容
code 的行为与match
在示例 6-6 中:
fn main() { let config_max = Some(3u8); if let Some(max) = config_max { println!("The maximum is configured to be {max}"); } }
语法if let
采用模式和表达式,由等号
标志。它的工作方式与match
,其中表达式被赋予match
而 pattern 是它的第一只手臂。在本例中,模式为Some(max)
和max
绑定到Some
.然后我们可以
用max
在if let
块,就像我们使用的一样max
在
相应的match
手臂。代码中的if let
block 不会运行
value 与模式不匹配。
用if let
意味着更少的键入、更少的缩进和更少的样板代码。
但是,您失去了详尽的检查match
执行。选择
之间match
和if let
取决于您在特定
情况,以及是否适合
丢失详尽的检查。
换句话说,您可以想到if let
作为语法 sugar 为match
那
当值与一个模式匹配时运行代码,然后忽略所有其他值。
我们可以包含一个else
替换为if let
.与else
与 Case 中的 case 对应的代码块相同_
match
表达式,该表达式等效于if let
和else
.回想一下Coin
enum 定义,其中Quarter
变体还持有UsState
价值。如果我们想计算所有非 25 美分硬币,我们会看到 while
宣布 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 { Coin::Quarter(state) => println!("State quarter from {state:?}!"), _ => count += 1, } }
或者我们可以使用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 使用match
,请记住if let
也在您的 Rust 工具箱中。
总结
我们现在已经介绍了如何使用枚举创建自定义类型,这些类型可以是
枚举值集。我们已经展示了标准库的Option<T>
type 可帮助您使用 type 系统来防止错误。当枚举值具有
data 中,你可以使用match
或if let
提取并使用这些
值,具体取决于您需要处理多少个案例。
您的 Rust 程序现在可以使用 structs 和 枚举。创建要在 API 中使用的自定义类型可确保类型安全: compiler 将确保您的函数只获取每个 function 期望。
为了向您的用户提供一个组织良好的 API,这很简单 要使用并且只公开您的用户将需要的内容,现在让我们转向 Rust 的模块。
本文档由官方文档翻译而来,如有差异请以官方英文文档(https://doc.rust-lang.org/)为准