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`では必要ありません。
}