while let
与 if let
类似,while let
可以简化繁琐的 match
序列。让我们来看一个递增 i
的例子:
#![allow(unused)] fn main() { // 创建 `Option<i32>` 类型的 `optional` let mut optional = Some(0); // 重复执行此测试。 loop { match optional { // 如果 `optional` 解构成功,则执行代码块。 Some(i) => { if i > 9 { println!("大于 9,退出!"); optional = None; } else { println!("`i` 是 `{:?}`。再试一次。", i); optional = Some(i + 1); } // ^ 需要 3 层缩进! }, // 当解构失败时退出循环: _ => { break; } // ^ 为什么需要这样?一定有更好的方法! } } }
使用 while let
可以让这个序列更加简洁:
fn main() { // 创建 `Option<i32>` 类型的 `optional` let mut optional = Some(0); // 这段代码的含义是:当 `let` 将 `optional` 解构为 `Some(i)` 时, // 执行代码块 `{}`,否则 `break`。 while let Some(i) = optional { if i > 9 { println!("大于 9,退出!"); optional = None; } else { println!("`i` 是 `{:?}`。再试一次。", i); optional = Some(i + 1); } // ^ 减少了代码缩进右移,无需显式处理失败情况 } // ^ `if let` 可以有额外的 `else`/`else if` 子句,`while let` 则没有。 }