簡體   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