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!("Greater than 9, quit!");
                optional = None;
            } else {
                println!("`i` is `{:?}`. Try again.", 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!("Greater than 9, quit!");
            optional = None;
        } else {
            println!("`i` is `{:?}`. Try again.", i);
            optional = Some(i + 1);
        }
        // ^ 右方向へのずれが少なく、失敗するケースを
        // 明示的に処理する必要がありません。
    }
    // ^ `if let` には追加のオプションの `else`/`else if`
    // 句がありました。`while let` にはこれらはありません。
}

参照:

enumOption、および RFC