2.5 `IntoIterator`
05-
IntoIterator — Comprehensive Rust2 分钟阅读
译文 · 基于 Comprehensive Rust
原文链接: https://google.github.io/comprehensive-rust/iterators/intoiterator.html
2.5 IntoIterator
Iterator trait 告诉你:一旦有了迭代器,该如何迭代。相关的
IntoIterator
trait 则定义了如何为某个类型创建迭代器。它会被 for 循环自动使用。
| |
IntoIterator正是让for循环得以工作的 trait。诸如Vec<T>以及它们的引用(如&Vec<T>和&[T])都实现了它;区间(range)也实现了它。因此你可以写for i in some_vec { .. }来遍历向量,但some_vec.next()并不存在。点开
IntoIterator的文档。每个IntoIterator实现都必须声明两个类型:
Item:要迭代的元素类型,例如i8,IntoIter:into_iter方法返回的Iterator类型。注意
IntoIter与Item是关联的:该迭代器必须具有相同的Item类型,也就是说它返回Option<Item>。本示例遍历所有 x、y 坐标的组合。
试着在
main里对grid迭代两次。为什么会失败?注意IntoIterator::into_iter会取得self的所有权。修复方法:为
&Grid实现IntoIterator,并创建一个按引用迭代的GridRefIter。同时包含GridIter与GridRefIter的版本见此 playground。标准库类型也会遇到同样的问题:
for e in some_vector会取得some_vector的所有权,并迭代其中的自有元素。应改用for e in &some_vector,以迭代元素的引用。