在书中Learning Rust With Entirely Too Many Linked Lists , 在 implementation IntoIter
,为什么 List
包含在元组结构中?相反,Iterator
可以为 List
实现。
最佳答案
是的,在这种情况下,技术上可以为 List
实现 Iterator
。这通常不是真的,因为迭代器可能需要不在基础容器中的不同状态(例如,Vec
迭代器可能需要存储下一个项目的索引以有效迭代)。
一个原因是,如果将来实现发生变化,并且 List
迭代器具有额外的状态会更好,则可以在不更改任何调用者的情况下更改迭代器结构。
另一个原因是,在 Rust 中,通常使用类型来缩小接口(interface)以减少出错的机会。如果您直接实现 Iterator
(并且可能是 IntoIterator
返回 self
),那么用户就可以调用其他 List
迭代期间的方法,这可能是错误的。相反,迭代器是一种单独的类型,这意味着在迭代期间不可能有人插入项目。 (请注意,在 for
循环中,由于借用/移动规则,无论如何都很难做到这一点,但一般要点仍然存在)。
关于iterator - 为什么 List 包裹在 IntoIter 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40797598/