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
循环中更为方便,后者则更加明确,可以在其他上下文中使用。