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

时间:2015-09-15 17:17:37

标签: loops reference rust

在使用Rust时,我发现您可以通过引用循环遍历VecHashMap 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()似乎是我发现的例子中普遍偏爱的方法。

1 个答案:

答案 0 :(得分:7)

  

两种循环方法在功能上是否相同

是的,它们完全相同。

The implementation of IntoIterator for &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()
    }
}

The implementation of IntoIterator for &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