Rustのfor_eachメソッドの書き方【iter().for_each()】

615, 2023-01-03

目次

Rustでfor_eachメソッドを使う

Rustでfor_each文を使いたい場合はiter()から使えるfor_each()メソッドを使います。
for_each()メソッドは他のメソッドと組み合わせることも可能で汎用性があります。

結論のコードで言うと↓のようなコードを書きます。

    let v: Vec<i32> = vec![1, 2, 3];

    v.iter().for_each(|x| println!("{}", x));
    // 1
    // 2
    // 3

この記事ではRustのfor_each()メソッドについて具体的に書いていきます。

ベクタ(Vec)でfor_eachを使う

Rustのベクタはiter()を呼び出したあとにfor_each()を使うことができます。

    let v: Vec<i32> = vec![1, 2, 3];

    v.iter().for_each(|x| println!("{}", x));
    // 1
    // 2
    // 3

for_each(|x| println!("{}", x))」となっているところがfor_each()メソッドです。

xにはベクタの先頭の要素から順に渡されていきます。
つまりベクタは「vec![1, 2, 3]」で初期化されていますので、先頭の要素は1、その次は2、その次は3になります。

ブレースを使って複数行書く

↑の例ではfor_each()内ではprintln!()だけ書いていますがブレース({})で複数行書くこともできます。

    let v: Vec<i32> = vec![1, 2, 3];

    v.iter().for_each(|x| {
        let y = x * 2;
        println!("{}", y);
    });        
    // 2
    // 4
    // 6

↑の例ではブレース({})の中に複数行の文を書いています。
内容はxを2倍にしてyに保存。そしてyprintln!()で表示です。

他のメソッドとfor_eachを組み合わせる

iter()を呼び出した後はfilter()enumerate()など色々なメソッドが使えます。
for_each()もその中の1つのメソッドですので、他のメソッドと組み合わせることも可能です。
たとえばfilter()と組み合わせる場合は↓のようになります。

    let v: Vec<i32> = vec![1, 2, 3, 4];

    v.iter()
        .filter(|x| *x % 2 == 0)
        .for_each(|x| println!("{}", x));        
    // 2
    // 4

filter()は式の結果がtrueなら要素を保存しfalseなら要素を除外するメソッドです。
↑の場合はfilter()2で割り切れる要素だけ抽出し、その結果をfor_each()で回しています。
結果は「2」「4」と出力されます。

配列をfor_each()する

先ほどまではベクタを回していましたがもちろんiter()は配列やハッシュマップにも使えます。
配列をfor_each()で回す場合は↓のようなコードになります。

    let ary = [1, 2, 3];

    ary.iter().for_each(|x| println!("{}", x));
    // 1
    // 2
    // 3

ベクタの場合と同じコードを書ける点が非常に優れていると言えるかと思います。
もっともそうでないとfor_each()で書くメリットも無いわけですが。

ハッシュマップをfor_each()する

ハッシュマップの場合は引数xがタプルになります。
0番目の要素がキーで1番目の要素が値です。

use std::collections::HashMap;
    let mut map = HashMap::new();
    map.insert("hige", "hoge");
    map.insert("moge", "fuge");

    map.iter().for_each(|x| println!("{} -> {}", x.0, x.1));
    // hige -> hoge
    // moge -> fuge

↑のコードはmapというハッシュマップの変数に、キー「hige」に値「hoge」を、キー「moge」に値「fuge」をinsert()で設定しています。
そのmapからiter()を呼び出しfor_each()を使って回しています。

iter()を呼び出せばfor_each()のようなメソッドをいくつも組み合わせて使えるので便利ですね。

おわりに

今回はRustのfor_each()メソッドについて解説しました。
for_each()を使って快適なループ処理を行ってください。

(^ _ ^)

回るよ回る

(・ v ・)

目が回る



この記事のアンケートを送信する