Rust 迭代器

迭代器

迭代器是惰性的,调用方法使用迭代器之前,不会有任何的效果。

每个迭代器都实现了iterator trait,这个 trait 定义在标准库里。

trait Iterator {
    type Item;
    // type Item和Self::Item这种用法叫做定义trait的关联类型。这里只定义了这个函数,并没有实现,如果使用自定义迭代器的话,就要在这里的重写next方法。
    fn next(&mut self) -> Option<Self::Item>;
}

fn iter_check() {
    let v1 = vec![1, 2, 3];
    let mut v1_iter = v1.iter();

    if let Some(v) = v1_iter.next() {
        println!("{}", v);
    } else {
        println!("end")
    }
}

next 方法是被要求实现的唯一的一个方法,next一次返回一个元素,当迭代器结束的时候返回None。

迭代可变引用

fn iter_check_mut() {
    // 通过迭代的方法修改列表
    let mut v2 = vec![1, 2, 3];
    let mut v2_iter = v2.iter_mut();
    if let Some(v) = v2_iter.next() {
        *v = 3
    }
    println!("{:?}", v2_iter)
}

自定义迭代器

struct Counter {
    count: u32,
}

impl Counter {
    fn new() -> Counter {
        Counter {count: 0, }
    }
}

impl Iterator for Counter {

    type Item = u32;
    fn next(&mut self) -> Option<Self::Item> {
        self.count += 1;
        if self.count < 6 {
            Some(self.count)
        } else {
            None
        }
    }
    
}

fn main() {
    let mut counter = Counter::new();
    for i in (0..6) {
        if let Some(v) = counter.next() {
            println!("{} {}", i, v);
        } else {
            println!("{}", i);
            break;
        }
    }
    println!("Hello, world!");
}
上一篇:Rust队列和栈


下一篇:Rust双向链表