Iterator

Iterator トレイトは、コレクション内の一連の要素に対して順番に処理を適用することを可能にします。このトレイトはnextメソッドを必要とし、それにより多くのメソッドを提供します。多くの標準ライブラリ型で Iterator が実装されていますが、自分で実装することもできます。

struct Fibonacci {
    curr: u32,
    next: u32,
}

impl Iterator for Fibonacci {
    type Item = u32;

    fn next(&mut self) -> Option<Self::Item> {
        let new_next = self.curr + self.next;
        self.curr = self.next;
        self.next = new_next;
        Some(self.curr)
    }
}

fn main() {
    let fib = Fibonacci { curr: 0, next: 1 };
    for (i, n) in fib.enumerate().take(5) {
        println!("fib({i}): {n}");
    }
}
This slide should take about 5 minutes.
  • Iterator トレイトは、コレクションに対する多くの一般的な関数型プログラミング オペレーション(例: mapfilterreduce など)を実装します。このトレイトのドキュメントにおいて、これらのすべてのオペレーションに関する説明を確認できます。Rust では、これらの関数により、同等の命令型実装と同じくらい効率的なコードが生成されます。

  • IntoIterator は、forループを実現するためのトレイトです。コレクション型(Vec<T> など)と、それらに対する参照(&Vec<T>&[T] など)において実装されています。また、範囲を表す型においても実装されています。for i in some_vec { .. } を使用してベクターを反復処理できるのに、some_vec.next() が存在しないのはこのためです。