Wenn ich zweimal über eine Scheibe iterieren möchte, funktioniert es gut :
%Vor%Aber wenn ich versuche, zweimal über einen Vektor zu iterieren, schlägt es fehl :
%Vor% Ich sehe, dass das Merkmal IntoIterator
self
nach Wert nimmt, daher macht es für mich Sinn, dass das zweite Beispiel fehlschlägt. Aber warum ist das erste Beispiel erfolgreich?
Wie du schon gesagt hast, funktioniert for
, indem du das Ding nimmst, von dem du es gebeten hast, es zu durchlaufen und es durch IntoIterator::into_iter
um den tatsächlichen Iterator-Wert zu erzeugen. Wie Sie bereits gesagt haben, nimmt into_iter
das Subjekt nach Wert .
Wenn Sie also direkt über Vector
iterieren, bedeutet dies, dass Sie den gesamten Vektor nach Wert in seine IntoIterator
-Implementierung übergeben und somit den Vektor im Prozess verbrauchen. Deshalb kann man einen Vektor nicht zweimal direkt über einen Vektor iterieren: beim ersten Durchlauf wird er iteriert, danach ist er nicht mehr vorhanden.
Allerdings sind Slices unterschiedlich: Ein Slice ist ein unveränderlicher, ausgeliehener Zeiger auf seine Daten; unveränderliche, geliehene Zeiger können frei kopiert werden. Dies bedeutet, dass die IntoIterator
für unveränderliche Slices nur die Daten ausborgt und sie nicht konsumiert (nicht dass sie könnte ). Oder, um es anders zu betrachten, seine IntoIterator
-Implementierung nimmt einfach eine Kopie des Slices, während Sie kein Vec
kopieren können.
Es sollte beachtet werden, dass Sie über eine Vec
ohne iterieren können, indem Sie über einen Borrow iterieren. Wenn Sie die Dokumentation für Vec
überprüfen, werden Sie feststellen, dass hier Implementierungen aufgelistet sind von IntoIterator
für Vec<T>
, &Vec<T>
und &mut Vec<T>
.
Tags und Links rust