说明向量(以及其他集合类型)是Iterator
吗?
例如,我可以通过以下方式循环遍历向量,因为它实现了Iterator
特征(据我所知):
let v = vec![1, 2, 3, 4, 5];
for x in &v {
println!("{}", x);
}
但是,如果我想使用属于Iterator
特征的函数(例如fold
,map
或filter
),为什么我必须先调用{{ 1}}在那个向量上?
我的另一个想法可能是,矢量可以转换为iter()
,在这种情况下,上面的语法更有意义。
答案 0 :(得分:26)
不,矢量不是迭代器。
但是它实现了特性IntoIterator
,for
循环使用该特征将向量转换为所需的迭代器。
在documentation for Vec
中,您可以看到IntoIterator
以三种方式实现:对于移动的Vec<T>
,并且迭代器返回类型为T
的项,共享引用&Vec<T>
,其中迭代器返回共享引用&T
,而&mut Vec<T>
则返回可变引用。
iter()
只是Vec
中的一种方法,可以将Vec<T>
直接转换为返回共享引用的迭代器,而无需先将其转换为引用。有一个兄弟方法iter_mut()
用于生成可变引用。