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

KCh*_*oux 8 loops reference rust

在玩Rust时,我发现你可以通过引用而不是使用来循环Vecs和HashMaps(可能还有其他).iter().

let xs = vec![1, 2, 3, 4, 5];
for x in &xs {
    println!("x == {}", x);
}
Run Code Online (Sandbox Code Playgroud)

.iter()函数似乎具有相同的行为.

let xs = vec![1, 2, 3, 4, 5];
for x in xs.iter() {
    println!("x == {}", x);
}
Run Code Online (Sandbox Code Playgroud)

两种循环方法在功能上是相同的,还是两者之间的行为有细微差别?我注意到这.iter()似乎是我发现的例子中普遍偏爱的方法.

She*_*ter 7

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

是的,它们完全相同.

的实施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()
    }
}
Run Code Online (Sandbox Code Playgroud)

的实施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()
    }
}
Run Code Online (Sandbox Code Playgroud)

注意,两者都只是打电话iter().

我注意到.iter()似乎是我发现的例子中普遍偏爱的方法.

我用collection.iter(),每当我想使用一个迭代器适配器,和我用&collection,每当我想干脆直接遍历的集合.