Ich versuche, einen Iterator auf meiner eigenen Struktur zu implementieren. Meine allgemeine Vorgehensweise besteht darin, einen Iterator zu erzeugen und zu speichern, wenn das erste Mal next
aufgerufen wird, und dann diesen Iterator jedes Mal aufzurufen, wenn ich einen Wert benötige.Versuch, einen Iterator zu implementieren: kann aufgrund von in Konflikt stehenden Anforderungen keine geeignete Lebensdauer ableiten
Mein minimal Versagen Beispiel looks like this, und das Herz ist:
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 = _>>);
}
Mein Code zu kompilieren fehlschlägt, die folgende Meldung Herstellung:
help: consider using an explicit lifetime parameter as shown: fn next(self: &'a mut Self) -> Option<<Self>::Item>
der Beratung Nach hilft nicht (führt nur zu mehr Kompilierungsfehlern, die besagen, dass meine Implementierung mit der Iterator-Traitdefinition nicht kompatibel ist.
Ich würde mich über die Hilfe freuen, die wh es geht schief und wie kann ich es beheben.
'! Self.vals.is_some()' => 'self.vals.is_none()' und einige 'map' auf der letzten Zeile würden es auch schöner machen. – Shepmaster
Das macht langsam Sinn - danke für die ausführliche Antwort! Aber ich habe Mühe, diesen Ansatz zu verallgemeinern: Mein wirkliches Szenario ist eher wie https://play.rust-lang.org/?gist=c43e28b29426cbc50982242f222599f8&version=nightly&backtrace=0, wo ich nicht nur ein Feld packe, sondern * eine anrufe Funktion auf self, die das Feld zurückgibt (ein abgeleiteter Wert). Gibt es einen Ansatz, der in dieser Situation funktioniert? – Bosh
@Bosh: Wenn Sie das "a" in "&" ein self "in" look_for_details "entfernen, wird es kompiliert. –