Kann ich einen Iterator schreiben, der sich selbst mutiert und dann eine Referenz in sich selbst liefert?

Ich bin auf ein Problem gestoßen, das sich wie folgt vereinfacht:

struct MyIter {
    vec: Vec<i8>,
}

fn fill_with_useful_data(v: &mut Vec<i8>) {
    /* ... */
}

impl<'a> Iterator for MyIter {
    type Item = &'a [i8];

    fn next(&mut self) -> Option<&'a [i8]> {
        fill_with_useful_data(&mut self.vec);

        Some(&self.vec)
    }
}

fn main() {
    for slice in (MyIter { vec: Vec::new() }) {
        println!("{}", slice);
    }
}

Dies erzeugt den Fehler:

error[E0207]: the lifetime parameter `'a` is not constrained by the impl trait, self type, or predicates
 --> src/main.rs:9:6
  |
9 | impl<'a> Iterator for MyIter {
  |      ^^ unconstrained lifetime parameter

Die Idee ist, dass der Iterator eine Menge Arbeit leistet, die sich in seinen Feldern widerspiegelt, und bei jedem Schritt einen Verweis auf den aufrufenden Code in sich selbst liefert. In diesem Fall könnte ich es so modellieren, dass es eine Kopie des Staates anstelle des Verweises ergibt, aber wir wollen so tun, als wäre das nicht möglich oder nur unpraktisch teuer.

Intuitiv sollte dies kein Problem sein, da die Ausleihprüfung sicherstellen kann, dass.next() wird nicht erneut aufgerufen, solange die angegebene Referenz weiterhin zum Überprüfen des Iteratorstatus verwendet werden kann, aber dasIterator trait scheint für so etwas nicht direkt zu sorgen. Selbst mit einigen Permutationen wie dem Festhalten an einem Verweis auf den Vektor im Iterator selbst oder dem Festhalten des Iterators an einem Verweis oder etwas, um die Lebensdauern früher in den Typ einzubrennen, kann ich nichts hinter den Leihprüfer bringe

Ich lese die "Iteratoren mit veränderlichen Referenzen "Blogpost, aber ich bin nicht sicher, ob / wie es auf mein Problem zutrifft, das keine veränderlichen Verweise beinhaltet.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage