iter方法

IntoIterator 消耗 self 以创建一个迭代器。

这样做的好处是:你可以从迭代器中获取拥有所有权的值。例如,如果你在一个 Vec<Ticket> 上调用 .into_iter(),你会得到一个返回 Ticket 值的迭代器。

但这同时也是它的缺点:在调用了 .into_iter() 后,你不能再使用原来的集合。 很多时候,你希望在不消耗集合的情况下遍历它,而是查看对值的引用。 以 Vec<Ticket> 为例,你可能想要遍历 &Ticket 类型的值。

大多数集合都提供了一个名为 .iter() 的方法,它返回一个迭代器,该迭代器提供对集合元素的引用。 例如:

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

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

#![allow(unused)]
fn main() {
let numbers: Vec<u32> = vec![1, 2];
// 在这里,`n` 的类型为 `&u32`
// 我们不必显式地调用 `.iter()`
// 在 `for` 循环中直接使用 `&numbers` 就足够了
for n in &numbers {
    // [...]
}
}

通常情况下,提供两种选项是惯用的做法:

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

前者在 for 循环中更为方便,后者则更加明确,可以在其他上下文中使用。