導入
同じ処理を繰り返すのがループです。Rust には loop・while・for の3つがあります。まず無限ループの loop と、条件付きの while を見ましょう。loop すら値を返せる、というのが Rust らしいところです。
説明
fn main() {
// loop: 明示的に break するまで無限に回る
let mut count = 0;
let result = loop {
count += 1;
if count == 5 {
break count * 10; // break に値を付けるとループの値になる
}
};
println!("result = {result}"); // result = 50
// while: 条件が true の間くり返す
let mut n = 3;
while n > 0 {
println!("{n}...");
n -= 1;
}
println!("発射!");
}
loop { ... }… 無条件にくり返し、breakで抜けます。break count * 10;のようにbreakに値を渡すと、その値がloop式全体の値になります。「条件を満たすまで試行して結果を取り出す」処理が綺麗に書けます。while n > 0 { ... }… 条件が真の間くり返す、おなじみの形。count += 1はcount = count + 1の短縮形です。
なお、ネストしたループにはラベル('name:)を付けて、どのループを break するか指定できます。
'outer: for i in 0..5 {
for j in 0..5 {
if i + j == 4 { break 'outer; } // 外側のループごと抜ける
}
}
試すには
loop の break count * 10; の count * 10 を消して単なる break; にすると、result に入る値がなくなります。その場合は let result = loop {...} の受け取りを外す必要があります。「break が値を返す」挙動を実感してみましょう。