繁体   English   中英

尝试实现迭代器:由于需求冲突而无法推断出适当的生存期

[英]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的引用

在这种情况下,我们可以通过在闭包中存储值的副本来解决此问题。 这分两个步骤完成:

  1. self.look_for分配给局部变量,并在闭包中使用局部变量。 这样,闭包不与self绑定。
  2. 添加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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM