比如内置的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
呢? 请大佬们指点一下😊
1
共 5 条评论, 1 页
评论区
写评论Vec
本身不是迭代器,没有实现Iterator
trait。迭代器是要知道自己迭代到什么地方的。看看
next
的函数签名:注意这里是
&mut self
;每迭代一次,迭代器都会变。但
Vec
就是个向量,并不知道它迭代到了什么地方。因此没法直接为Vec
实现Iterator
trait,而需要 std::vec::IntoIter、std::slice::Iter、std::slice::IterMut 这些东西。Vec 本身不是 迭代器,而其方法 iter() 建立一个生成器。针对一个 Vec 对象,理所当然可以建立多个迭代器了。
自己 trait 实现迭代器,自然也就可以 next(), 与 iter() 方法无关,事实上根本就没有 iter() 方法吧。
还真是,
Vec
可以多个迭代器同时迭代👍, 多谢大佬🙏对以下内容的回复:
更正:第一句话,Vec可以用多个迭代器迭代,可以不见了。
回答最后一个问题,因为Vec用多个迭代器同时迭代。例如:
实现列表两两相加。
但是Vec也实现了IntoIterator,可以在for循环直接转换为迭代器。