## Keyboard shortcuts

Press `←` or `→` to navigate between chapters

Press `S` or `/` to search in the book

Press `?` to show this help

Press `Esc` to hide this help

# 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` 则没有。
    }

### 另请参阅：

`enum`、`Option` 和 RFC