Ich versuche, eine Liste zipper zu implementieren. Bisher habe ich:Unendlich Schleife bei der Implementierung von benutzerdefinierten Iterator in 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
}
}
ich jetzt versuchen, einen Iterator zu implementieren
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)
}
}
In meinem Kopf das macht Sinn. Wenn ich über ListZipper
iteriere, möchte ich über left
, dann focus
und dann right
iterieren. Also kette ich diese Iteratoren und gebe einfach next()
zurück.
Dies funktioniert, wenn alle Felder in ListZipper
leer sind. Sobald man nicht leer ist, führt die Iteration über ListZipper
zu einer Endlosschleife.
Das Problem ist nicht die Kette. Wenn ich das durch z.B. self.left.iter()
und left
ist nicht leer, das Problem ist das gleiche. Ebenso für focus
und right
.
Ich habe versucht, alle Elemente im Iterator zu drucken und es scheint durch die VecDeque
von vorne nach hinten gehen, und dann bleibt stecken. I.e. next()
bewegt den Cursor nicht weiter, wenn er die Rückseite erreicht.
Warum?
Ich weiß, ich möchte nicht ListZipper
selbst ein Iterator sein, aber das ist eine andere Diskussion.
Sie wissen, 'Next' erstellt jedes Mal einen neuen Iterator, wenn es richtig heißt? – mcarton