• while let
    • 参见:

    while let

    if let 类似,while let 会产生更加难看的 match 的一连串内容。
    考虑下面的有关增量 i 的一连串内容:

    1. // 将 `optional` 设为 `Option<i32>` 类型
    2. let mut optional = Some(0);
    3. // Repeatedly try this test.
    4. // 重复运行这个测试。
    5. loop {
    6. match optional {
    7. // 如果 `optional` 解构成功,就执行下面语句块。
    8. Some(i) => {
    9. if i > 9 {
    10. println!("Greater than 9, quit!");
    11. optional = None;
    12. } else {
    13. println!("`i` is `{:?}`. Try again.", i);
    14. optional = Some(i + 1);
    15. }
    16. // ^ 需要三个缩进!
    17. },
    18. // 当解构失败时退出循环:
    19. _ => { break; }
    20. // ^ 为什么要这样的语句呢?肯定有更优雅的处理方式!
    21. }
    22. }

    使用 while let 可以使这一连串内容变得更加优雅:

    1. fn main() {
    2. // 将 `optional` 设为 `Option<i32>` 类型
    3. let mut optional = Some(0);
    4. // 分析:当 `let` 将 `optional` 解构成 `Some(i)` 时,就
    5. // 执行语句块(`{}`)。否则中断退出(`break`)。
    6. while let Some(i) = optional {
    7. if i > 9 {
    8. println!("Greater than 9, quit!");
    9. optional = None;
    10. } else {
    11. println!("`i` is `{:?}`. Try again.", i);
    12. optional = Some(i + 1);
    13. }
    14. // ^ 使用的缩进更少,并且不用显式地处理失败情况。
    15. }
    16. // ^ `if let` 有额外可选的 `else`/`else if` 分句,
    17. // 而 `while let` 没有。
    18. }

    参见:

    枚举Option,和 RFC