ユーニックス総合研究所

  • home
  • archives
  • rust-for-each

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

  • 作成日: 2023-01-03
  • 更新日: 2023-12-24
  • カテゴリ: Rust

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()メソッドについて具体的に書いていきます。

関連記事
RustでJSONの読み書きを行う
RustでTCPクライアント/サーバーを作る【ソケット通信】
Rustでファイルサイズを取得する方法【std::fs::metadata】
RustのBoxの使い方【ヒープにメモリを確保!初心者向け】
RustのResultでエラーハンドリング処理を行う
RustのThread(スレッド)で並行処理をする方法
RustのVecの使い方【vec!, push, pop】
Rustのassert!の使い方【assert!, assert_eq!, assert_ne!】

ベクタ(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()を使って快適なループ処理を行ってください。

🦝 < 回るよ回る

🐭 < 目が回る