在Rust中,实现了Iterator就是一个迭代器,能够通过next方法遍历整个容器的内容。下面是定义:
trait Iterator {
type Item;
fn next(&mut self) -> Option<Self::Item>;
... // many default methods
}
下面是实例:
use std::fmt::Debug;
#[derive(Debug, Clone, Copy)]
struct Counter {
lower: u32,
upper: u32,
cur: u32,
}
impl Counter {
fn new(lower: u32, upper: u32) -> Counter {
Counter { lower, upper, cur: lower, }
}
}
impl Iterator for Counter {
type Item = u32;
fn next(&mut self) -> Option<Self::Item> {
self.cur += 1;
if self.cur <= self.upper {
Some(self.cur - 1)
} else {
self.cur = self.lower;
None
}
}
}
fn main() {
let mut cnt = Counter::new(0, 5);
let v = cnt.filter(|x| *x % 2 == 0).collect::<Vec<u32>>();
assert_eq!(vec![0, 2, 4], v);
let mut i = 0;
while let Some(v) = cnt.next() {
assert_eq!(i as u32, v);
i += 1;
}
for (i, v) in cnt.enumerate() {
assert_eq!(i as u32, v);
}
}