Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

Rust辞典

  1. トップページ
  2. Rust辞典
  3. iter() / iter_mut() / into_iter()

iter() / iter_mut() / into_iter()

コレクションからイテレータを取得する3つの方法です。参照・可変参照・所有権のどれを取り出すかによって使うメソッドが変わります。

構文
// 要素への不変参照(&T)を返すイテレータを生成します。
for item in collection.iter() { }

// 要素への可変参照(&mut T)を返すイテレータを生成します。
for item in collection.iter_mut() { }

// 要素の所有権(T)を取り出すイテレータを生成します(コレクションは消費されます)。
for item in collection.into_iter() { }

// forループはIntoIteratorトレイトを通じてinto_iterを自動呼び出しします。
for item in &collection { }     // iter()と同等です。
for item in &mut collection { } // iter_mut()と同等です。
for item in collection { }      // into_iter()と同等です。
メソッド一覧
メソッド / 構文要素の型概要
iter()&T不変参照を取り出します。コレクションの所有権は保持され、ループ後も元のコレクションを使用できます。
iter_mut()&mut T可変参照を取り出します。ループ内で要素の値を書き換えられます。
into_iter()T所有権ごと取り出します。呼び出し後はコレクションを使用できません。
&collection&Tforループで『iter()』と同等に動作します。最も一般的な書き方です。
&mut collection&mut Tforループで『iter_mut()』と同等に動作します。
サンプルコード
fn main() {
    let mut numbers = vec![1, 2, 3, 4, 5];

    // iter(): 不変参照でループします。ループ後もnumbersを使用できます。
    for n in numbers.iter() {
        print!("{} ", n); // &i32です。
    }
    println!();

    // &collectionはiter()と同等です。
    for n in &numbers {
        print!("{} ", n);
    }
    println!();

    // iter_mut(): 可変参照でループし、値を書き換えます。
    for n in numbers.iter_mut() {
        *n *= 2; // 逆参照して値を2倍にします。
    }
    println!("{:?}", numbers); // [2, 4, 6, 8, 10]

    // into_iter(): 所有権を移動させます。
    let words = vec!["hello", "world"];
    for word in words.into_iter() {
        print!("{} ", word); // Stringの所有権がwordに移ります。
    }
    println!();
    // ここでwordsを使おうとするとコンパイルエラーになります。

    // 配列でのiter使用例です。
    let arr = [10, 20, 30];
    let doubled: Vec<i32> = arr.iter().map(|&x| x * 2).collect();
    println!("{:?}", doubled); // [20, 40, 60]
}
概要

3つのイテレータ取得方法の選び方は「ループ後もコレクションを使うか」「要素を書き換えるか」で決まります。ほとんどの場合は読み取り専用の『iter()』(または『&collection』)を使います。『into_iter()』を呼び出したあとはコレクションの所有権が失われるため、ループ後に元のコレクションを参照しようとするとコンパイルエラーになります。

Rustのforループは内部で『IntoIterator』トレイトを使用しています。『&vec』はVecへの参照に対してIntoIteratorを実装しており、自動的に『iter()』相当の動作になります。実際のコードでは『for x in &vec』と書く方が多く見られます。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。