Was ist der Entwurfsgrund dafür, dass Vec
das Iterator
Merkmal nicht implementiert wird? Wenn immer iter()
alle Vektoren und Slices aufgerufen werden müssen, entstehen längere Codezeilen.
Beispiel:
let rx = xs.iter().zip(ys.iter());
im Vergleich zu Scala:
val rx = xs.zip(ys)
Antworten:
Ein Iterator hat einen Iterationsstatus. Es muss wissen, was das nächste Element sein wird, das Sie erhalten.
Ein Vektor an sich ist also kein Iterator, und die Unterscheidung ist wichtig. Sie können beispielsweise zwei Iteratoren über denselben Vektor mit jeweils einem bestimmten Iterationsstatus verwenden.
Ein Vektor kann Ihnen jedoch einen Iterator bereitstellen. Deshalb wird er implementiert
IntoIterator
, sodass Sie Folgendes schreiben können:Viele Funktionen
IntoIterator
benötigen eine Funktion, wenn ein Iterator benötigt wird, und das ist der Fallzip
, weshalbkann durch ersetzt werden
quelle
xs.zip(ys)
arbeitet man dann in Scala? Wird in Scala automatisch ein Iterator (Status) erstellt? Oder enthält sein "Listentyp" immer einen Iteratorstatus? Welche Lösung auch immer Scala verwendet: Warum verwendet Rust sie nicht?iter()
,into_iter()
unditer_mut()
ist wichtig.iter
) zu aktivieren und einen expliziten Aufrufiter_mut
für veränderbare Iteration zu erfordern .ys
inxs.iter().zip (ys)
: Wie wählen Sie verwendenys.iter()
oderys.iter_mut()
?ys
wirinto_iter
. Der Grund ist einfach:ys
Wird verbraucht, so machen andere Iteratorarten keinen Sinn.Welchen der drei Iteratoren sollte es implementieren? Es gibt drei verschiedene Arten von Iteratoren, die Sie von einem erhalten können
Vec
:vec.iter()
gibtIterator<Item = &T>
,vec.iter_mut()
gibtIterator<Item = &mut T>
und modifiziert den Vektor undvec.into_iter()
gibtIterator<Item = T>
und verbraucht dabei den Vektor.In Scala wird es auch nicht
Iterator
direkt implementiert , daIterator
der nächste Elementzeiger benötigt wird, den der Vektor selbst nicht hat. Da Scala jedoch keine Verschiebungssemantik hat, gibt es nur eine Möglichkeit, einen Iterator aus einem Vektor zu erstellen, sodass die Konvertierung implizit durchgeführt werden kann. Rust hat drei Methoden, also muss es dich fragen, welche du willst.quelle
into_iter()
ist derjenige, der den Vektor verbraucht;drain
unterscheidet sich darin, dass nur der Vektor geleert wird.