迭代器
迭代器
for
循环不过是for
循环能够依次对迭代器的任意元素进行访问,即:
for i in 1..10 {
println!("{}", i);
}
这里我们知道,.next()
方法,因此,for
循环就能完整的遍历一个循环。在Vec
来说:
let values = vec![1,2,3];
for x in values {
println!("{}", x);
}
在上面的代码中,我们并没有显式地将一个Vec
转换成一个迭代器,那么它是如何工作的呢?现在就打开标准库翻Vec
本身并没有实现 Iterator
,也就是说,你无法对Vec
本身调用 .next()
方法。但是,我们在搜索的时候,发现了Vec
实现了 IntoIterator
的
其实,for
循环真正循环的,并不是一个迭代器IntoIterator
这个
let values = vec![1, 2, 3];
{
let result = match IntoIterator::into_iter(values) {
mut iter => loop {
match iter.next() {
Some(x) => { println!("{}", x); },
None => break,
}
},
};
result
}
在这个代码里,我们首先对Vec
调用 into_iter
来判断其是否能被转换成一个迭代器,如果能,则进行迭代。那么,迭代器自己怎么办?为此,
impl<I: Iterator> IntoIterator for I {
// ...
}
也就是说,IntoIterator
,这个实现很简单,就是每次返回自己就好了。也就是说:任意一个 Iterator
都可以被用在 for
循环上!
无限迭代器
let inf_seq = (1..).into_iter();
不过不用担心这个无限增长的序列撑爆你的内存,占用你的collect
或者fold
!