[英]error: cannot infer an appropriate lifetime for autoref due to conflicting requirements [E0495]
[英]Trying to implement an iterator: cannot infer an appropriate lifetime due to conflicting requirements
我正在尝试在自己的结构上实现迭代器。 我的一般方法是,在第一次调用next
一次时生成并存储一个迭代器,然后在每次需要一个值时调用此迭代器。
我的最小失败示例如下所示 ,其核心是:
if !self.vals.is_some() {
self.vals = Some(Box::new({
self.display.chars().filter(|&i| i == self.look_for)
}) as Box<std::iter::Iterator<Item = _>>);
}
我的代码无法编译,并产生以下消息:
help: consider using an explicit lifetime parameter as shown: fn next(self: &'a mut Self) -> Option<<Self>::Item>
遵循建议无济于事(只会导致更多的编译错误,说我的实现与Iterator trait定义不兼容。
非常感谢您帮助我们了解发生了什么问题以及如何解决。
问题是传递给filter
的闭包需要借用self
,但是你不能在结构本身中存储对self
的引用 。
在这种情况下,我们可以通过在闭包中存储值的副本来解决此问题。 这分两个步骤完成:
self.look_for
分配给局部变量,并在闭包中使用局部变量。 这样,闭包不与self
绑定。 move
到关闭。 因此,闭包将按值捕获局部变量。 这是最终代码:
impl<'a> Iterator for StatefulCounter<'a> {
type Item = bool;
fn next(&mut self) -> Option<Self::Item> {
if !self.vals.is_some() {
let look_for = self.look_for;
self.vals = Some(Box::new({
self.display.chars().filter(move |&i| i == look_for)
}));
}
if let &Some(v) = &self.vals.as_mut().unwrap().next() {
Some(expensive(v))
} else {
None
}
}
}
不需要在Box
上进行显式强制转换,因此我将其删除。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.