Progrust Library.

// dictionary

loop式.

loop式は、本体のブロックを無限に繰り返すループです。breakに到達するまで終了しないため、繰り返し回数や継続条件を事前に決められない処理(リトライ・入力待ちなど)に向きます。break 値;でループ全体の値を生み出せる、値を生成するとしての性格が最もはっきりしたループです1

fn main() {
    let mut savings = 0;
    let days = loop {
        savings += 100; // 毎日100円ずつ貯金します
        if savings >= 1000 {
            break savings / 100; // breakに渡した値がloop式全体の値になります
        }
    };
    println!("{days}日で1000円たまりました");
}
Playgroundで開く

3種類のループとの比較

breakに渡した値はそのまま変数に束縛できます。whileforbreakに値を渡せず、式としての値は常にユニット型()です。

構文 繰り返しの条件 式としての値
loop なし(breakするまで無限) breakに渡した値(渡さなければ()
while式 条件がtrueの間 常に()
for式 範囲式などのイテレータに次の要素がある間 常に()

補足

breakしないloop式の型は!(never型)

breakを1つも含まないloop式は決して値を返さない「発散する式」で、型は!(never型)になります1。どんな型とも互換になるため、値を返す関数の中に置いてもコンパイルエラーになりません。

ループラベルで外側のループを抜ける

ループの前に'名前:ループラベルを付けると、ネストした内側からbreak '名前continue '名前で外側のループを直接操作できます。ラベルはloopだけでなくwhileforにも付けられます1。なお、ループ以外でもラベル付きブロック式'名前: { ... }ならbreak '名前 値;で値を返せます。

fn main() {
    'outer: for row in 1..=3 {
        for col in 1..=3 {
            if row * col == 6 {
                break 'outer; // 内側だけでなく外側のforごと抜けます
            }
            println!("{row} × {col} = {}", row * col);
        }
    }
}
Playgroundで開く

Footnotes

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

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

backlinks 6

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