本文へスキップ
BecomeCoder

Rustコース · 第2章 制御構文と関数 · レッスン8

繰り返し ― loop と while

ブラウザで完結

導入

同じ処理を繰り返すのがループです。Rust には loopwhilefor の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 += 1count = count + 1 の短縮形です。

なお、ネストしたループにはラベル'name:)を付けて、どのループを break するか指定できます。

'outer: for i in 0..5 {
    for j in 0..5 {
        if i + j == 4 { break 'outer; }   // 外側のループごと抜ける
    }
}

試すには

loopbreak count * 10;count * 10 を消して単なる break; にすると、result に入る値がなくなります。その場合は let result = loop {...} の受け取りを外す必要があります。「break が値を返す」挙動を実感してみましょう。

実際に動かしてみよう

下のエディタにRustを書いて「実行」を押すと、学習用シミュレータが println! の出力を表示します(本物のrustcではなく、教材の範囲を再現した軽量エンジンです)。struct・enum・match・トレイト・Vec/String/HashMap・Option/Result なども動きます。本文の例を書き換えて動かしてみましょう(所有権・借用チェッカーのコンパイルエラーは再現しないため、動きの確認用として使ってください)。

Rust — ブラウザ内で実行(学習用シミュレータ)

Rustの教材サブセットを動かす学習用シミュレータを読み込みます(本物のrustcではなく、動きを再現した軽量な自作エンジンです)。
スクロールして表示された時点でも自動で読み込まれます。