当循环时,.iter()和引用(&)有什么区别?

8

在使用Rust编程时,我发现可以通过引用循环遍历VecHashMap(以及可能的其他数据结构),而不是使用.iter()方法。

let xs = vec![1, 2, 3, 4, 5];
for x in &xs {
    println!("x == {}", x);
}
.iter()函数似乎具有相同的行为。
let xs = vec![1, 2, 3, 4, 5];
for x in xs.iter() {
    println!("x == {}", x);
}

这两种循环集合的方法在功能上是相同的,但它们之间存在微妙的差别吗?我注意到在我找到的示例中,使用 .iter() 似乎是普遍优先的方法。
1个回答

7

循环遍历集合的这两种方法在功能上是完全相同的。

是的,它们是相同的。

对于&Vec<T>IntoIterator的实现方式如下:

impl<'a, T> IntoIterator for &'a Vec<T> {
    type Item = &'a T;
    type IntoIter = slice::Iter<'a, T>;

    fn into_iter(self) -> slice::Iter<'a, T> {
        self.iter()
    }
}

对于&HashMap<K,V,S>IntoIterator的实现方式:

impl<'a, K, V, S> IntoIterator for &'a HashMap<K, V, S>
    where K: Eq + Hash, S: HashState
{
    type Item = (&'a K, &'a V);
    type IntoIter = Iter<'a, K, V>;

    fn into_iter(self) -> Iter<'a, K, V> {
        self.iter()
    }
}

请注意,两者都只是调用iter()

我注意到在我找到的示例中,.iter()似乎是普遍首选的方法。

当我想使用迭代器适配器时,我使用collection.iter(),当我想直接迭代集合时,我使用&collection


1
说实话,我很惊讶没有发现一些非常微妙和意外的区别。另外,哇,你是不是对 Rust 有着所有的答案?加一。 - KChaloux
@KChaloux 绝不是所有的答案。只是花了很多时间,读了近一年的许多好问题和答案。请注意,我也是顶级问题提问者之一。 ^_^ - Shepmaster

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