コンテンツにスキップ

制御フロー

条件分岐は式・文・ブロックで説明しています。ここでは繰り返しとループからの移動を扱います。

条件が true の間、本体を繰り返します。条件の () は任意で、条件は繰り返すたびに評価します。

remaining = 3;
while remaining > 0 {
print remaining;
remaining -= 1;
}

条件は bool である必要があります。本体は {} で囲み、通常どおり終了するときには () になるように書きます。たとえば本体の末尾に remaining だけを残すことはできません。

start..end は終点を含まず、start..=end は終点を含みます。1ずつ増える整数範囲だけに対応しています。

for i in 0..3 {
print i; // 0, 1, 2 をそれぞれ1行に出力
}
for i in 1..=3 {
print i; // 1, 2, 3
}

始点と終点は同じ整数型である必要があります。始点が終点より大きい範囲は空です。同じ場合は、.. なら0回、..= なら1回実行します。

両端はループに入る前に左から右へ一度だけ評価します。本体から終点の元になった変数を変更しても、繰り返す範囲は変わりません。

end = 3;
for i in 0..end {
end = 0;
print i; // 0, 1, 2
}

ループ変数は本体にだけ存在します。外側に見えている同名変数があるとエラーです。前のループが終われば、そのループ変数名を次のループで再利用できます。

ループ変数は変更できますが、繰り返し自体の進行は別に管理します。代入しても次の反復の値は変わりません。

for i in 0..3 {
i += 10;
print i; // 10, 11, 12
}

終点を含む範囲では、終点に到達したあとにカウンターを増やさず終了します。このため、i32・i64 の最大値を終点にできます。

break; は最も内側のループを終了し、continue; はそのループの次の反復へ進みます。ループの外では使えません。

sum = 0;
for i in 0..10 {
if i == 2 { continue; }
if i == 5 { break; }
sum += i;
}
print sum; // 8

ループ本体の中で、ブロック式に書いた場合も同じループに作用します。

while の条件式では break と continue を使えません。必要な判定は本体に書いてください。

value = 0;
while true {
if value == 3 { break; }
print value;
value += 1;
}

また、型検査器は while true を無限ループだと確定せず、ループが終了する可能性を残します。関数の戻り値を検査するときも同じです。

fn example() -> i32 {
while true {
return 1;
}
0 // 型検査に必要な末尾式。実行時にはここへ到達しない
}
print example();

実装の参照先: ループと制御フローの検査、範囲・ジャンプの C++ 出力。