迭代器负责遍历一个元素序列中的每个元素并决定序列何时结束。 在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函数。
还有一些调用迭代器来创建新的迭代器的方法,如map,filter等,但是一般最后还是要使用collect来进行消耗的。
只要实现Iterator trait的next方法就能够实现自定义的迭代器。
尽管迭代器是一种高层次的抽象,但它在编译后生成了与手写底层代码几乎一样的产物。迭代器是Rust语言中的一种零开销抽象 (zero-cost abstraction),这个词意味着我们在使用这些抽象时不会引入额外的运行时开销 。