1 迭代器```rust

pub trait Iterator { type Item; fn next(&mut self) -> Option; }

  1. - 通过`Iterator`来对集合类型进行迭代。
  2. - `next()`方法结合了`has_next()``get_next()`<br />
  3. <a name="jVraS"></a>
  4. # 2 三种迭代器
  5. rust中的集合类型通常通过结构体实现了三种不同类型的迭代器:
  6. - `IntoIter` 这种使用IntoIter结构体实现的迭代器,通过调用要求所有权的into_iter()方法生成,迭代器的`next()`方法返回`Option<T>`
  7. - `IterMut` 这种使用IterMut结构体实现的迭代器,通过调用要求独占引用的iter_mut()方法生成,迭代器的`next()`方法返回`Option<&mut T>`
  8. - `Iter` 这种使用Iter结构体实现的迭代器,通过调用要求共享引用的iter()方法生成,迭代器的`next()`方法返回`Option<&T>`
  9. <a name="bgmfV"></a>
  10. # 3 实现IntoIter
  11. - 不断调用`pop()`方法就可以实现一个简单的迭代器
  12. ```rust
  13. // 元组结构体是结构体的一种替代形式,常用于包装其他类型
  14. pub struct IntoIter<T>(List<T>);
  15. impl<T> List<T> {
  16. pub fn into_iter(self) -> IntoIter<T> {
  17. IntoIter(self)
  18. }
  19. }
  20. impl<T> Iterator for IntoIter<T> {
  21. type Item = T;
  22. fn next(&mut self) -> Option<Self::Item> {
  23. // 通过数值下标访问元组结构体包装的内容
  24. self.0.pop()
  25. }
  26. }
  • 测试代码

    1. #[test]
    2. fn into_iter() {
    3. let mut list = List::new();
    4. list.push(1); list.push(2); list.push(3);
    5. let mut iter = list.into_iter();
    6. assert_eq!(iter.next(), Some(3));
    7. assert_eq!(iter.next(), Some(2));
    8. assert_eq!(iter.next(), Some(1));
    9. assert_eq!(iter.next(), None);
    10. }