在使用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
。