Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

Rust辞典

loop / while / for

Rustのループ構文には『loop』『while』『for』の3種類があります。『loop』は無限ループで値を返せる特徴があり、『for』はイテレータと組み合わせて使います。

構文
// 無限ループです。breakで値を返せます。
let result = loop {
    // ...
    break 42;  // 42がresultに代入されます。
};

// 条件が真の間ループします。
while condition {
    // ...
}

// イテレータをループします(最もよく使います)。
for x in 0..5 {          // 0, 1, 2, 3, 4
    // ...
}
for x in 0..=5 {         // 0, 1, 2, 3, 4, 5(末尾を含む)
    // ...
}
for item in &vec {        // スライスの各要素を参照します。
    // ...
}

// ループを抜けたり次に進めます。
break;     // ループを終了します。
continue;  // 次のイテレーションに進みます。
構文一覧
構文概要
loop { }無限ループです。break で値を返せます。
while 条件 { }条件が true の間ループします。
while let Some(x) = opt.pop() { }パターンマッチが成功する間ループします。
for x in イテレータ { }イテレータの各要素を取り出してループします。
0..n0以上n未満の範囲です(末尾を含まない)。
0..=n0以上n以下の範囲です(末尾を含む)。
breakループを終了します。loop では break 値; で値を返せます。
continue残りの処理をスキップして次のイテレーションに進みます。
'label: loop { }ラベル付きループです。break 'label; でネストの外側を抜けます。
サンプルコード
fn main() {
    // loop:無限ループ+break で値を返す例です。
    let mut count = 0;
    let result = loop {
        count += 1;
        if count == 5 {
            break count * 2;  // breakした値がresultに代入されます。
        }
    };
    println!("loop結果: {}", result);  // 10

    // while:条件ループの例です。
    let mut n = 1;
    while n < 32 {
        print!("{} ", n);
        n *= 2;
    }
    println!();  // 1 2 4 8 16

    // while let:Optionが Some の間ループします。
    let mut stack = vec![1, 2, 3];
    while let Some(top) = stack.pop() {
        print!("{} ", top);  // 3 2 1
    }
    println!();

    // for + 範囲:0..5 は0〜4です。
    print!("0..5: ");
    for i in 0..5 {
        print!("{} ", i);
    }
    println!();

    // for + 範囲(末尾含む):0..=5 は0〜5です。
    print!("0..=5: ");
    for i in 0..=5 {
        print!("{} ", i);
    }
    println!();

    // for + スライスの参照です。
    let fruits = ["apple", "banana", "cherry"];
    for fruit in &fruits {
        println!("fruit: {}", fruit);
    }

    // enumerate でインデックスと値を同時に取得します。
    for (i, fruit) in fruits.iter().enumerate() {
        println!("  [{}] {}", i, fruit);
    }

    // ラベル付きループで多重ループを抜けます。
    'outer: for x in 0..3 {
        for y in 0..3 {
            if x == 1 && y == 1 {
                println!("({},{})で外側ループを抜けます", x, y);
                break 'outer;
            }
            print!("({},{}) ", x, y);
        }
    }
    println!();
}
概要

Rustでは『for』ループがイテレータプロトコルと密接に連携しています。スライスや配列を参照でループするときは『&』を忘れずに付けてください(付けないと所有権が移動してしまいます)。

『loop』は他言語の『while true』に相当しますが、値を返せる点が特徴的です。条件変数を使ってループを抜ける場合はwhileよりもloopの方がRustらしいコードになることがあります。

Rustのfor文はC言語スタイルの for(int i=0; i<n; i++) は存在しません。代わりに for i in 0..n を使います。

条件分岐は『if / else / if let』、パターンマッチは『match / パターンマッチ』を参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。