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