## 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() {
    // `optional`という変数の型を`Option<i32>`に指定。
    let mut optional = Some(0);

    // 変数の照合を繰り返し行います。
    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);
                }
                // ^ 3つものインデントが必要。
            },
            // デストラクトに失敗した場合、ループを脱出。
            _ => { 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