我試圖執行列表zipper。到目前爲止,我有:在Rust中實現自定義迭代器時出現無限循環
#[derive(RustcDecodable, RustcEncodable, Debug, Clone)]
pub struct ListZipper {
pub focus: Option<Tile>,
pub left: VecDeque<Tile>,
pub right: VecDeque<Tile>,
}
impl PartialEq for ListZipper {
fn eq(&self, other: &ListZipper) -> bool {
self.left == other.left && self.focus == other.focus && self.right == other.right
}
}
我現在想實現一個迭代器
impl Iterator for ListZipper {
type Item = Tile;
fn next(&mut self) -> Option<Tile> {
self.left.iter().chain(self.focus.iter()).chain(self.right.iter()).next().map(|w| *w)
}
}
在我的腦海這是有道理的。當遍歷ListZipper
時,我想遍歷left
,然後focus
,然後right
。所以我鏈接這些迭代器,並返回next()
。
如果ListZipper
所有字段爲空,這工作得很好。只要不是空的,則通過ListZipper
迭代導致無限循環。
問題不在於鏈條。如果我用例如self.left.iter()
和left
不是空的,問題是一樣的。同樣適用於focus
和right
。
我想打印在迭代的所有元素,它似乎從前面經過VecDeque
備份,然後卡住。即當它到達後面時,next()
不會前進光標。
爲什麼?
我意識到我可能不希望ListZipper
自己是一個迭代器,但那是另一個討論。
你知道'next'每次調用都會創建一個新的迭代器嗎? – mcarton