Rust 基本文法 -繰り返し処理-

2024/05/07に公開

はじめに

久しぶりに、Rust 基本文法シリーズです。
今回は、どの言語でも肝となってくる繰り返し処理について一緒に学んでいければと思います。

コードは Rust Playground でも試すことができますので、もし宜しければ手を動かしてみてください。
https://play.rust-lang.org/

繰り返し処理

Rust における繰り返し処理の方法はいくつか挙げられますが、
比較的、代表的なものにフォーカスしつつ、普段私が業務やプライベートでも利用する機会の多い方法に絞り込んで紹介できればと思います。

  • for ~ in ~ 文
  • iter() + for_each()

for ~ in ~ 文

非常によく使う繰り返し処理は、配列に対して繰り返すケースではないでしょうか。
以下の例では、Vec 型の users に対して for ~ in ~ で繰り返し処理をしています。
for の後は、 for文内で使用できる任意の変数名を入力し、in の後にはユーザー名の配列を格納している変数を指定しています。
userには 配列の要素の中身である、&str型の文字列が入ってきます。

fn main() {
    // ユーザー名の配列
    let users = vec!["Alice", "Bob", "Charlie"];

    // 繰り返し
    for user in users {
        println!("{}", user);
    }
}

cargo runをコマンドラインで、実行すると・・

$ cargo run

Alice
Bob
Charlie

このようにユーザーの名前がそれぞれ出力されました。

さらに、以下のように in の後に、繰り返す要素の数を入れることで、
0 ~ 10 までの数字を繰り返し処理するということができます。

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

実行すると・・

0
1
2
3
4
5
6
7
8
9
10

このように順番に数字を出力することが可能となります。

for ~ in ~は基本動作になってくると思いますので、押さえておきたいところです。

iter() + for_each()

え? loopじゃないの?と思った方もいらっしゃるかもしれませんが、
私的には、こちらの方がよく利用します。
(loopbreak の記述漏れがリスクですね・・)

for とほとんど変わらないですが、iter()でイテレータという実体を生成し、ループさせます。

fn main() {
    let nums = vec![1, 2, 3, 4, 5];

    nums.iter().for_each(|num| {
        println!("{}", num);
    });
}

実行すると・・

1
2
3
4
5

このように出力されます。

for_each()メソッド内の第一引数は numとなっていますが、
これは借用のi32となり、配列nums所有権のムーブが発生しません。

以下のように nums変数を for ループの後に呼び出すことが可能です。

fn main() {
    let nums = vec![1, 2, 3, 4, 5];

    nums.iter().for_each(|num| {
        println!("{}", num);
    });

    println!("{:?}", nums);
}

for文と iter()メソッドを使った組み合わせも可能です。

fn main() {
    let nums = vec![1, 2, 3, 4, 5];

    for num in nums.iter() {
        println!("{}", num);
    }
}

おわりに

いかがだったでしょうか。

基本文法シリーズでは毎回のようにコメントしていますが、
これらの基本文法は他の言語でも活きてくる要素がかなり詰まっていると思います。
今後も基本文法シリーズを出していこうかと考えていますので、一緒に学んでいきましょう。

コラボスタイル Developers

Discussion