Progrust Library.

// 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限定)から、whileifの条件で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

  1. The Rust Reference: Loops and other breakable expressions 2

  2. E0571 - Error codes index

  3. Announcing Rust 1.88.0 | Rust Blog

この辞書が使われているページ

backlinks 4

  1. 辞書if式
  2. 辞書loop式
  3. 辞書ループラベル
  4. 動かして学ぶRustプログラミング問題集 › 第3章 制御フロー