Rust by Example

7.7 while let

if letと同様に、while letも不格好なmatch処理を多少マシにしてくれます。例えば、以下のiをインクリメントする処理を見てください。

// `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`では必要が無い。 }

See also:

列挙型(enum), Option, RFC