while let
if letと同様に、while letも冗長なmatch文を簡略化するのに使えます。
iをインクリメントする次の節を見てください。
#![allow(unused_variables)] fn main() { // `Option<i32>`型の`optional`を作ります let mut optional = Some(0); // この試行を繰り返します。 loop { match optional { // `optional`がSome(i)にマッチすれば、このブロックを実行します。 Some(i) => { if i > 9 { println!("Greater than 9, quit!"); // 0より大きいので、終了します! optional = None; } else { println!("`i` is `{:?}`. Try again.", i); // `i`は`{:?}`です。もう1度試してください。 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`にはありません。 }