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` にはこれらはありません。 }