流程控制 - while let
优质
小牛编辑
130浏览
2023-12-01
和 if let
类似,while let
会产生更加难看的 match
的一连串内容。
考虑下面的有关增量 i
的一连串内容:
// 将 `optional` 设为 `Option<i32>` 类型
let mut optional = Some(0);
// Repeatedly try this test.
// 重复运行这个测试。
loop {
match optional {
// 如果 `optional` 解构成功,就执行下面语句块。
Some(i) => {
if i > 9 {
println!("Greater than 9, quit!");
optional = None;
} else {
println!("`i` is `{:?}`. Try again.", i);
optional = Some(i + 1);
}
// ^ 需要三个缩进!
},
// 当解构失败时退出循环:
_ => { break; }
// ^ 为什么要这样的语句呢?肯定有更优雅的处理方式!
}
}
使用 while let
可以使这一连串内容变得更加优雅:
fn main() {
// 将 `optional` 设为 `Option<i32>` 类型
let mut optional = Some(0);
// 分析:当 `let` 将 `optional` 解构成 `Some(i)` 时,就
// 执行语句块(`{}`)。否则中断退出(`break`)。
while let Some(i) = optional {
if i > 9 {
println!("Greater than 9, quit!");
optional = None;
} else {
println!("`i` is `{:?}`. Try again.", i);
optional = Some(i + 1);
}
// ^ 使用的缩进更少,并且不用显式地处理失败情况。
}
// ^ `if let` 有额外可选的 `else`/`else if` 分句,
// 而 `while let` 没有。
}
参见:
枚举
,Option
,和 RFC