![](/img/trans.png)
[英]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.