// 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に渡した値はそのまま変数に束縛できます。while・forはbreakに値を渡せず、式としての値は常にユニット型()です。
| 構文 | 繰り返しの条件 | 式としての値 |
|---|---|---|
loop |
なし(breakするまで無限) |
breakに渡した値(渡さなければ()) |
| while式 | 条件がtrueの間 |
常に() |
| for式 | 範囲式などのイテレータに次の要素がある間 | 常に() |
補足
breakしないloop式の型は!(never型)
breakを1つも含まないloop式は決して値を返さない「発散する式」で、型は!(never型)になります1。どんな型とも互換になるため、値を返す関数の中に置いてもコンパイルエラーになりません。
ループラベルで外側のループを抜ける
ループの前に'名前:のループラベルを付けると、ネストした内側からbreak '名前・continue '名前で外側のループを直接操作できます。ラベルはloopだけでなくwhile・forにも付けられます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
この辞書が使われているページ
backlinks 6