はじめに
この実験では、Rust におけるwhile let
の使い方を示します。変数をインクリメントする場合やOption
型を反復処理する際に、match
シーケンスを使うよりも、より簡潔で効率的な代替手段としての使い方です。
注: 実験でファイル名が指定されていない場合、好きなファイル名を使うことができます。たとえば、
main.rs
を使って、rustc main.rs &&./main
でコンパイルして実行することができます。
This tutorial is from open-source community. Access the source code
💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください
この実験では、Rust におけるwhile let
の使い方を示します。変数をインクリメントする場合やOption
型を反復処理する際に、match
シーケンスを使うよりも、より簡潔で効率的な代替手段としての使い方です。
注: 実験でファイル名が指定されていない場合、好きなファイル名を使うことができます。たとえば、
main.rs
を使って、rustc main.rs &&./main
でコンパイルして実行することができます。
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 でさらに多くの実験を練習することができます。