迭代器负责遍历一个元素序列中的每个元素并决定序列何时结束。 在Rust中,迭代器是惰性的,这意味着创建后的迭代器除非主动调用来消耗,否则不会产生仍和效果。

let v1 = vec![1,2,3];
let v1_iter = i1.iter();
for val in v1_iter {
	println!("{}", val);
}

Iterator trait和next方法

所有的迭代器都实现了标准库的iterator trait。其定义如下:

pub trait Iterator {
	type Item;
	fn next(&mut self) -> Option(Self::Item);
}

Iterator要求实现next方法,每次调用时返回一个包裹在Some中的迭代器元素,并在迭代结束时返回None。

迭代器是需要被消耗才有意义的,如调用sum函数。

还有一些调用迭代器来创建新的迭代器的方法,如mapfilter等,但是一般最后还是要使用collect来进行消耗的。

只要实现Iterator trait的next方法就能够实现自定义的迭代器。

尽管迭代器是一种高层次的抽象,但它在编译后生成了与手写底层代码几乎一样的产物。迭代器是Rust语言中的一种零开销抽象 (zero-cost abstraction),这个词意味着我们在使用这些抽象时不会引入额外的运行时开销 。