// dictionary
while式.
while式は、条件がtrueの間だけ本体のブロックを繰り返すループです。本体を実行するたびに条件を再評価し、falseになった時点で終了します1。条件には論理値型の式を書きます(0など数値を条件にはできません)。式全体の値は常にユニット型()で、loop式と違いbreakで値を返せません。
fn main() {
let mut savings = 0;
while savings < 1000 {
savings += 300; // 毎回300円ずつ貯金します
println!("現在の貯金額: {savings}円");
}
println!("目標の1000円に到達しました");
}Playgroundで開くwhile let式
条件の代わりにパターンを書くwhile letは、パターンがマッチする間だけ繰り返します1。「値を取り出せる間ずっと処理する」という定番の書き方で、ベクタ(Vec)のpopのようにOption型を返すメソッドと相性が良い構文です。
fn main() {
let mut cart = vec!["りんご", "みかん", "バナナ"];
while let Some(item) = cart.pop() {
println!("{item}を袋に詰めました"); // Someでなくなったら終了します
}
}Playgroundで開く補足
breakで値を返せない(E0571)
break 値;が使えるループはloop式だけです(ループ以外ではループラベルを付けたブロック式でも使えます)。while(およびfor式)で値を渡すとコンパイルエラーE0571になります2。
fn main() {
let mut count = 0;
let result = while count < 3 {
count += 1;
break count; // エラー: E0571(while式のbreakには値を渡せない)
};
}
let chains — 条件を&&で連結する
Rust 1.88(edition 2024限定)から、whileやifの条件でletパターンと論理式を論理演算子&&で連結できます3。「Someを取り出せて、かつ条件も満たす間」のような繰り返しが1行で書けます。
fn main() {
let mut stock = vec![1200, 500, 300]; // popは末尾から取り出します
let mut total = 0;
while let Some(price) = stock.pop() && total + price <= 1000 {
total += price; // 予算1000円に収まる間だけ買います
}
println!("合計: {total}円");
}Playgroundで開くFootnotes
この辞書が使われているページ
backlinks 4