Dies funktioniert, weil Iterator
implementiert rev()
wo self
ist DoubleEndedIterator
:
Wenn ich jedoch vec.iter().rev()
in &vec.rev()
ändere, wird es nicht kompiliert, weil:
%Vor%
Außerdem:
%Vor%
Aber ruft implizit keine for-Schleife IntoIterator
auf? Wird &vec
oder vec.iter()
als idiomatischer Rost betrachtet?
Wenn Sie nur die Vec
durchlaufen, ist &vec
idiomatisch. Das funktioniert, weil &Vec<T>
implementiert IntoIterator
, was die for-Schleife verwendet.
Wenn Sie jedoch Iterator
-Methoden wie rev
, filter
usw. aufrufen möchten, benötigen Sie eine tatsächliche Iterator
(da Vec
nicht implementiert Iterator
, nur IntoIterator
).
Also das:
%Vor%entspricht:
%Vor% d. Es gibt keine Möglichkeit, IntoIterator
zu verwenden, bevor Sie versuchen, Iterator
Methoden aufzurufen.
Dies ist nur die grundlegende Priorität des &
-Operators. Im ersten Fall wird jede Methode nacheinander aufgerufen:
Der zweite Fall, der &
bindet nach allen Methoden:
Verwenden Sie im Allgemeinen &vec
, wenn Sie können, aber wenn Sie Iterator-Adaptermethoden verwenden müssen, verwenden Sie iter
oder into_iter
.