Warum kann ich zweimal über eine Scheibe iterieren, aber keinen Vektor?

8

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?

    
Jack O'Connor 03.01.2016, 02:37
quelle

1 Antwort

12

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> .

%Vor%     
DK. 03.01.2016, 02:50
quelle

Tags und Links