Reverse-Iteration über ein & vec gegen vec.iter ()

8

Dies funktioniert, weil Iterator implementiert rev() wo self ist DoubleEndedIterator :

%Vor%

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?

    
HiDefender 29.09.2016, 16:01
quelle

2 Antworten

11

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.

    
Chris Emerson 29.09.2016, 16:06
quelle
3

Dies ist nur die grundlegende Priorität des & -Operators. Im ersten Fall wird jede Methode nacheinander aufgerufen:

%Vor%

Der zweite Fall, der & bindet nach allen Methoden:

%Vor%

Verwenden Sie im Allgemeinen &vec , wenn Sie können, aber wenn Sie Iterator-Adaptermethoden verwenden müssen, verwenden Sie iter oder into_iter .

    
Shepmaster 29.09.2016 16:06
quelle

Tags und Links