我有一个Iterator
看起来像这样的实现:
struct MyType {
// stuff
}
struct Snapshot {
// stuff
}
impl MyType {
pub fn iter(&mut self) -> MyIterator {
MyIterator {
foo: self
}
}
}
struct MyIterator<'a> {
foo: &'a mut MyType
}
impl<'a> Iterator for MyIterator<'a> {
type Item = Snapshot;
fn next(&mut self) -> Option<Self::Item> {
if self.cheap_condition() {
self.cheap_mutation(); // Inexpensive
let s: Snapshot = self.snapshot(); // Expensive copying
Some(s)
} else {
None
}
}
}
如果我想使用 generate 的每个实例,这很好用Snapshot
,但是如果我想使用Iterator::step_by
or之类的东西Iterator::last
,我不关心中间Snapshot
s,生成那些未使用的值所产生的成本是一个巨大的性能损失。
我可以重写每一个方法,Iterator
这样昂贵的操作只在必要时发生,但我觉得必须有一种更简单、更惯用的方法来做到这一点,或者一种懒惰地Snapshot
从中间类型生成与迭代对应的方法因为Item
如果Iterator::next
没有再次被调用。
我不想返回对 的引用MyType
,因为我希望我生成的sSnapshot
具有独立的生命周期,例如,使 的结果比 的实例寿命更长。Iterator::collect()
MyType