循环时,.iter() 与引用 (&) 有何不同?



在使用Rust时,我发现可以通过引用循环Vec s和HashMap s(可能还有其他),而不是使用.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()似乎是我发现的示例中普遍首选的方法。

遍历集合的两种方法在功能上是否相同

是的,它们是一样的。

IntoIterator&Vec<T>的实现:

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()
    }
}

IntoIterator&HashMap<K, V, S>的实现:

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

相关内容