日本の山岳一覧・百名山 API を開発しましたCLICK !

Rust | 繰り返し処理 [ loop / while / for ] とラベル

Rust loop / while / for
  • URLをコピーしました!

Rustの制御フローをコントロールするための制御構文、その中でもループ処理に焦点を当てていきたいと思います。

Rustでの繰り返し処理

  1. 無限ループ:loop
  2. 特定の条件下のループ:while
  3. 特定の回数のループ:for
目次

制御構文 ループ

loop

基本的な書き方

fn main() {
    let mut count = 0;
    loop {
        count += 1;
        if count > 100 {
            break;
        }
        println!("{}", count);
    };
}

loopは、何度も処理を繰り返し実行することができます。

つまり、無限ループを簡単に作成することができます。

繰り返しを抜ける場合は、breakを使用します。

breakを忘れると、意図せず無限ループとなるので注意しましょう!笑

また、loopは式であり、値を返すことが可能であるため、以下のようなコードを書くことも可能です。

fn main() {
    let mut count = 0;
    let result = loop {
        count += 1;
        if count == 100 {
            break count;
        }
    };
    println!("{}", result);
}

無限ループはwhile Trueでも同じですが、ループのたびに条件を確認しないため、若干高速です。

while

基本的な書き方

fn main() {
    let mut count = 0;
    while count <= 100 {
        println!("{}", count);
        count += 1;
    }
}

whileは、特定の条件を満たす場合に、処理を繰り返したい場合に使用します。

また、loop同様にbreakで繰り返し処理を抜け出すことができます。

fn main() {
    let mut count = 0;
    while count <= 200 {
        println!("{}", count);
        count += 1;
        if count > 100 {
            break;
        }
    }
}

for

forは、繰り返し処理を行う回数が決まっている場合に使用します。

Range

fn main() {
    // 10回の繰り返し処理を行う
    for count in 0..10 {
        println!("{}", count);
    }
}

数値..数値で、Range型を書くことができます。

比較として、Pythonのrangeを置いておきます。

if __name__ == '__main__':
    for i in range(10):
        print(i)

10回の繰り返し処理を行う場合のコードは、
以下のJavaScriptのコードと比べると、簡単に書けて便利そうですね。

for (let count = 0; count < 10; count++) {
    console.log(count);
}

for-in

fn main() {
    // 配列の要素数だけ繰り返し処理を行う
    let numbers = [0, 1, 2, 3, 4];
    for num in numbers {
        println!("{}", num);
    }
}

for文の中でも、breakを使用することができます。

fn main() {
    // 配列の要素数だけ繰り返し処理を行う
    let numbers = [0, 1, 2, 3, 4];
    for num in numbers {
        if num == 2 {
            break;
        }
        println!("{}", num);
    }
}

ラベル

ラベルを使って、特定の繰り返し処理を抜ける

loop、while、forには、ラベルを付けることができます。
そのラベルをbreak時に指定することで、抜け出す繰り返し処理を指定することができます。

fn main() {
    'main: loop {
        println!("main 1");
        'sub: loop {
            println!("sub 1");
            break 'main;
            println!("sub 2"); // 到達しない
        }
        println!("main 2"); // 到達しない
    }
}

ラベル subのloopの中で、ラベル mainを指定してbreakしているため、
sub 2main 2が表示されることはありません。

まとめ

whileで無限ループを作ろうと以下のようなコードを書くと、
以下のような warning が出たのが印象的でした!

fn main() {
    while true {
        println!("無限ループ");
        break;
    }
}
warning: denote infinite loops with `loop { ... }`
 --> src/main.rs:2:5
  |
2 |     while true {
  |     ^^^^^^^^^^ help: use `loop`
  |
  = note: `#[warn(while_true)]` on by default

warning: 1 warning emitted

loop使いなさい、とのことです。

それぞれの特徴を理解して、適切な記法で繰り返し処理を書くことが大切ですね。

著:初田直也, 著:山口聖弘, 著:吉川哲史, 著:豊田優貴, 著:松本健太郎, 著:原将己, 著:中村謙弘, 著:フォルシア株式会社
¥3,208 (2024/04/16 19:00時点 | Amazon調べ)
\楽天ポイント5倍セール!/
楽天市場
Rust loop / while / for

この記事が気に入ったら
フォローしてね!

  • URLをコピーしました!

コメント

コメントする

目次