Rust笔记 - Iterator trait

185 阅读1分钟

在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);
    }
}