1 迭代器```rust
pub trait Iterator {
type Item;
fn next(&mut self) -> Option
- 通过`Iterator`来对集合类型进行迭代。
- `next()`方法结合了`has_next()`和`get_next()`<br />
<a name="jVraS"></a>
# 2 三种迭代器
rust中的集合类型通常通过结构体实现了三种不同类型的迭代器:
- `IntoIter` 这种使用IntoIter结构体实现的迭代器,通过调用要求所有权的into_iter()方法生成,迭代器的`next()`方法返回`Option<T>`
- `IterMut` 这种使用IterMut结构体实现的迭代器,通过调用要求独占引用的iter_mut()方法生成,迭代器的`next()`方法返回`Option<&mut T>`
- `Iter` 这种使用Iter结构体实现的迭代器,通过调用要求共享引用的iter()方法生成,迭代器的`next()`方法返回`Option<&T>`
<a name="bgmfV"></a>
# 3 实现IntoIter
- 不断调用`pop()`方法就可以实现一个简单的迭代器
```rust
// 元组结构体是结构体的一种替代形式,常用于包装其他类型
pub struct IntoIter<T>(List<T>);
impl<T> List<T> {
pub fn into_iter(self) -> IntoIter<T> {
IntoIter(self)
}
}
impl<T> Iterator for IntoIter<T> {
type Item = T;
fn next(&mut self) -> Option<Self::Item> {
// 通过数值下标访问元组结构体包装的内容
self.0.pop()
}
}
测试代码
#[test]
fn into_iter() {
let mut list = List::new();
list.push(1); list.push(2); list.push(3);
let mut iter = list.into_iter();
assert_eq!(iter.next(), Some(3));
assert_eq!(iter.next(), Some(2));
assert_eq!(iter.next(), Some(1));
assert_eq!(iter.next(), None);
}