4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

for

イテレータに対してループ処理を行う場合はforを利用します。一番シンプルなケースはRangeオブジェクトを使用するパターンです。Rangeオブジェクトは..を使うと簡単に作成できます。

fn main() {
    for i in 0..5 {
        println!("i: {}", i);
    }
}

「イテレータ」はIteratorトレイトのインスタンスであること、を指しています(ややこしい)。
普段は(少なくとも筆者は)あまり意識することはありませんが、JavaScriptにもイテレータの概念があります。詳しくはイテレーターとジェネレーターを参照してください。

配列やベクタのようなコレクションに対してもforを使用できます。注意点として、単にforに対してコレクションを渡すとデフォルトでは暗黙的にそのコレクションのinto_iterが呼び出されます。この方法では、コレクションの各要素は直接使用されます。すなわち、コレクションの要素の所有権はループに移るため、ループの後にコレクションを参照することはできません。

fn main() {
    let numbers = vec![1, 2, 3];
    for num in numbers {
        println!("num: {}", num);
    }
    // println!("{:?}", numbers); // エラー: 所有権が移動している
}

これを防ぐには、明示的にiterを呼び出します。この方法では、各ループで要素の参照を借用するので、所有権は移動しません。

fn main() {
    let numbers = vec![1, 2, 3];
    for num in numbers.iter() {
        println!("num: {}", num);
    }
    println!("{:?}", numbers); // 問題なく参照可能
}

while

イテレータ関係なく、指定の条件を満たす限りループ処理を続行したい場合はwhileを使用します。

fn main() {
    let mut counter = 0;
    while counter < 5 {
        println!("counter: {}", counter);
        counter += 1;
    }
}

ifと同様に、Optionな値(SomeNoneの値)を扱いたいが、Noneのときは何もしたくないケースではwhile let構文を使用できます。

fn main() {
    let mut numbers = Some(5);

    while let Some(num) = numbers {
        println!("num: {}", num);
        numbers = if num > 1 { Some(num - 1) } else { None };
    }
}

loop

while(true)と同等の働きをします。条件判定の処理がないので、若干高速です。

fn main() {
    let mut count = 0;

    loop {
        if count >= 5 {
            break;
        }
        println!("count: {}", count);
        count += 1;
    }
}

loopは値を返すことができます。breakの後に値を書いておくと、その値をloopを抜けた後に使用できます。ユースケースとして、処理が成功するまでリトライするものが挙げられます。

fn main() {
    let mut attempts = 0;

    let result = loop {
        attempts += 1;
        if attempts == 3 {
            break "Success!";
        }
    };

    println!("Result: {}", result);
}

ループを飛ばしたいとき、抜けたいとき

各ループを次に飛ばしたいときはcontinueを使用します。また、途中でループそのものを抜け出したい場合はbreakを使用します。

fn main() {
    for i in 0..10 {
        if i % 2 == 0 {
            continue; // 偶数をスキップ
        }
        if i > 7 {
            break; // 7を超えたらループを終了
        }
        println!("i: {}", i);
    }
}
4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?