简洁的控制流if let
这if letsyntax 允许您组合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,我们打印出Somevariant 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 letblock 不会运行
value 与模式不匹配。
用if let意味着更少的键入、更少的缩进和更少的样板代码。
但是,您失去了详尽的检查match执行。选择
之间match和if let取决于您在特定
情况,以及是否适合
丢失详尽的检查。
换句话说,您可以想到if let作为语法 sugar 为match那
当值与一个模式匹配时运行代码,然后忽略所有其他值。
我们可以包含一个else替换为if let.与else与 Case 中的 case 对应的代码块相同_match表达式,该表达式等效于if let和else.回想一下Coinenum 定义,其中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/)为准