While Let を使った簡潔な Rust の Option 反復処理

RustRustBeginner
オンラインで実践に進む

This tutorial is from open-source community. Access the source code

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、Rust におけるwhile letの使い方を示します。変数をインクリメントする場合やOption型を反復処理する際に、matchシーケンスを使うよりも、より簡潔で効率的な代替手段としての使い方です。

注: 実験でファイル名が指定されていない場合、好きなファイル名を使うことができます。たとえば、main.rsを使って、rustc main.rs &&./mainでコンパイルして実行することができます。

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!("9 を超えました、終了します!");
                optional = None;
            } else {
                println!("`i` は `{:?}` です。もう一度試してください。", 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!("9 を超えました、終了します!");
            optional = None;
        } else {
            println!("`i` は `{:?}` です。もう一度試してください。", i);
            optional = Some(i + 1);
        }
        // ^ 右方向のずれが少なく、失敗したケースを明示的に処理する必要がありません。
    }
    // ^ `if let`には追加のオプションの `else`/`else if`節がありました。`while let`にはこれらはありません。
}

まとめ

おめでとうございます!あなたは While Let の実験を完了しました。あなたのスキルを向上させるために、LabEx でさらに多くの実験を練習することができます。