.iter()

IntoIterator消费 (consume) self 来创建迭代器。

这有它的好处:你从迭代器拿到的是拥有所有权 (owned) 的值。 例如:在 Vec<Ticket> 上调用 .into_iter() 会得到一个返回 Ticket 值的迭代器。

这也有缺点:调用 .into_iter() 之后你就不能再使用原集合了。 很多时候你想在不消费集合的前提下遍历它,看到值的引用 (reference)。 对 Vec<Ticket> 来说,你想要的是遍历 &Ticket 值。

大多数集合都暴露了一个 .iter() 方法,返回对集合元素引用的迭代器。 例如:

let numbers: Vec<u32> = vec![1, 2];
// 这里 `n` 的类型是 `&u32`
for n in numbers.iter() {
    // [...]
}

这种模式可以通过为对集合的引用实现 IntoIterator 来简化。 上面的例子中就是 &Vec<Ticket>
标准库这样做了,所以下面的代码可以工作:

let numbers: Vec<u32> = vec![1, 2];
// 这里 `n` 的类型是 `&u32`
// 我们没有显式调用 `.iter()`
// 在 `for` 循环中使用 `&numbers` 就够了
for n in &numbers {
    // [...]
}

习惯上同时提供两种方式:

  • 为对集合的引用实现 IntoIterator
  • 一个返回对集合元素引用的迭代器的 .iter() 方法。

前者在 for 循环里方便,后者更显式,可以在其他场景使用。

原文链接:英文原文