< 返回版块

ilp64 发表于 2019-11-29 11:05

Tags:Iterator,iter,next

比如内置的Vec, 在调用next之前需要先调用iter获得iterator, 代码如下

let a = vec![1, 2, 3];
let mut ai = a.iter();
let first = ai.next();

但是自己实现的Iterator trait就可以直接调next了呢, 代码如下

struct Counter {
    count: u32
}

impl Counter {
    fn new() -> Self {
        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 a = Counter::new();
    let first = a.next(); // 这里可以直接调next
}

我能想到的是为结构体实现Iterator trait后, 结构体就是一个iterator了, 所以可以直接next, 那如果这样的话, 为啥内置的Vec不直接实现成iterator 呢? 请大佬们指点一下😊

评论区

写评论
AlephAlpha 2019-12-02 09:31

Vec 本身不是迭代器,没有实现 Iterator trait。

迭代器是要知道自己迭代到什么地方的。看看 next 的函数签名:

fn next(&mut self) -> Option<Self::Item>

注意这里是 &mut self;每迭代一次,迭代器都会变。

Vec 就是个向量,并不知道它迭代到了什么地方。因此没法直接为 Vec 实现 Iterator trait,而需要 std::vec::IntoIterstd::slice::Iterstd::slice::IterMut 这些东西。

xie-jirong 2019-11-29 21:39

Vec 本身不是 迭代器,而其方法 iter() 建立一个生成器。针对一个 Vec 对象,理所当然可以建立多个迭代器了。

自己 trait 实现迭代器,自然也就可以 next(), 与 iter() 方法无关,事实上根本就没有 iter() 方法吧。

作者 ilp64 2019-11-29 12:19

还真是, Vec可以多个迭代器同时迭代👍, 多谢大佬🙏

对以下内容的回复:

xjkdev 2019-11-29 11:50

更正:第一句话,Vec可以用多个迭代器迭代,可以不见了。

xjkdev 2019-11-29 11:42

回答最后一个问题,因为Vec用多个迭代器同时迭代。例如:

let some_vec = [1,2,3,4,5];
let mut it1 = some_vec.iter();
let mut it2 = some_vec.iter();
it2.next();
let result: Vec<i32>= it1.zip(it2).map(|x| x.0 + x.1).collect();
assert_eq!(vec![3, 5, 7, 9], result);

实现列表两两相加。

但是Vec也实现了IntoIterator,可以在for循环直接转换为迭代器。

1 共 5 条评论, 1 页