在Rust中,向量是迭代器吗?

38

向量(以及其他集合类型)是否可以准确地被称为Iterator

例如,我可以按照以下方式循环遍历向量,因为它实现了Iterator trait(就我所知):

let v = vec![1, 2, 3, 4, 5];

for x in &v {
    println!("{}", x);
}

然而,如果我想使用属于Iterator特征的函数(例如foldmapfilter),为什么必须先调用iter()来处理那个向量?

我想过的另一个想法是,也许一个向量可以转换成一个Iterator,在这种情况下,上述语法更有意义。


1
https://doc.rust-lang.org/book/iterators.html 讲了一些关于 for x in &vfor x in v.iter() 的内容,这两种方式都是有效的。但我还不熟悉 Rust,所以无法解释或总结它们! - Peter Cordes
1个回答

65
不,向量不是迭代器。
但它实现了特质IntoIterator,而for循环使用该特质将向量转换为所需的迭代器。
Vec文档中,你可以看到IntoIterator有三种实现方式:
  • Vec<T>,被移动且迭代器返回类型为T的项目,
  • 共享引用&Vec<T>,其中迭代器返回共享引用&T
  • &mut Vec<T>,返回可变引用。

iter()Vec中的一个方法,可以将Vec<T>直接转换为返回共享引用的迭代器,而无需先将其转换为引用。还有一个类似的方法iter_mut(),用于生成可变引用。


3
在处理vec向量时,是否有理由更喜欢使用for foo in vec而不是for foo in vec.iter() - Binou
5
这取决于你正在做什么,以及在循环之后是否仍需要vec。使用for foo in vec,向量的每个元素都会移动到foo中,循环中的代码可以将其移动到其他地方,即重复使用它而不克隆它,因此如果元素很大,这将更有效率。这也更简洁,因此你可以首先尝试for foo in vec,如果不行,借用检查器会提醒你。 - starblue
3
调用 for foo in vec 和调用 for foo in vec.into_iter() 是同义的吗?调用 for foo in &vecfor foo in vec.iter() 是相同的,调用 for foo in &mut vecfor foo in vec.iter_mut() 也是相同的吗? - Florian Kusche
1
@FlorianKusche 这是正确的! - Naveen Santhanavel
如果它是同义的,最惯用的方法是什么? - Jens

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接