Rust ループ

Rust は柔軟な条件文に加えて、ループ構造の設計も非常に成熟しています。この点は、経験豊富な開発者であれば感じ取れるはずです。

while ループ

while ループは最も典型的な条件文ループです:

例

fn main() {
    let mut number = 1;
    while number != 4 {
        println!("{}", number);
        number += 1;
    }
    println!("EXIT");
}

実行結果:

1
2
3
EXIT

Rust 言語には、このチュートリアルが編纂された時点では do-while の使い方はありませんが、do は予約語として規定されており、将来のバージョンで使われるかもしれません。

C 言語では for ループは 3 つの式でループを制御しますが、Rust にはこのような使い方はなく、while ループで代用する必要があります:

C 言語

int i;
for (i = 0; i < 10; i++) {
    // ループ本体
}

Rust

let mut i = 0;
while i < 10 {
    // ループ本体
    i += 1;
}

for ループ

for ループは最もよく使われるループ構造で、線形データ構造(配列など)を走査するためによく使われます。for ループで配列を走査する場合:

例

fn main() {
    let a = [10, 20, 30, 40, 50];
    for i in a.iter() {
        println!("値は : {}", i);
    }
}

実行結果:

值为 : 10
值为 : 20
值为 : 30
值为 : 40
值为 : 50

このプログラムの for ループは配列 a の走査を行っています。a.iter() は a のイテレータ(iterator)を表しており、オブジェクトに関する章を学ぶまでは詳述しません。

もちろん、for ループは実際には添え字(インデックス)で配列にアクセスすることもできます:

例

fn main() {
let a = [10, 20, 30, 40, 50];
    for i in 0..5 {
        println!("a[{}] = {}", i, a[i]);
    }
}

実行結果:

a[0] = 10
a[1] = 20
a[2] = 30
a[3] = 40
a[4] = 50

loop ループ

経験豊富な開発者であれば、次のような状況に何度か遭遇したことがあるはずです:あるループが先頭と末尾でループを続行するかどうかを判断できず、ループ本体の途中のどこかでループの進行を制御しなければならない場合です。このような場合、私たちはよく while (true) ループ本体の中で途中でループを抜ける操作を実装します。

Rust 言語にはネイティブの無限ループ構造 —— loop があります:

例

fn main() {
    let s = ['R', 'U', 'N', 'O', 'O', 'B'];
    let mut i = 0;
    loop {
        let ch = s[i];
        if ch == 'O' {
            break;
        }
        println!("\'{}\'", ch);
        i += 1;
    }
}

実行結果:

'R' 
'U' 
'N' 

loop ループは break キーワードによって、return のようにループ全体を終了させ、外部に戻り値を渡すことができます。これは非常に巧妙な設計です。なぜなら、loop のようなループは検索ツールとしてよく使われ、何かを見つけたら当然その結果を渡す必要があるからです:

例

fn main() {
    let s = ['R', 'U', 'N', 'O', 'O', 'B'];
    let mut i = 0;
    let location = loop {
        let ch = s[i];
        if ch == 'O' {
            break i;
        }
        i += 1;
    };
    println!(" \'O\'のインデックスは {}", location);
}

実行結果:

 'O' 的索引为 3
その他の拡張