2016-09-29 47 views
8

這工作,因爲Iterator實現rev()其中selfDoubleEndedIterator通過反向迭代一個&更多與vec.iter()

let vec: Vec<i32> = Vec::new(); 
for x in vec.iter().rev() { 
    //Do stuff 
} 

但是,如果我改變vec.iter().rev()&vec.rev()它不能編譯,因爲:

no method named `rev` found for type `std::vec::Vec<i32>` in the current scope 

此外:

the method `rev` exists but the following trait bounds were not satisfied: `std::vec::Vec<i32> : std::iter::Iterator`, `[i32] : std::iter::Iterator` 

但沒有一個for循環隱含調用IntoIterator&vecvec.iter()認爲慣用的鏽?

回答

11

如果你只是遍歷Vec,那麼&vec是慣用的。這是可行的,因爲&Vec<T>實現了IntoIterator,這是for循環的用途。

但是,如果你要調用Iterator方法,如revfilter,等等,你需要一個實際的Iterator(因爲Vec沒有實現Iterator,只有IntoIterator)。

所以這個:

for x in &vec.rev() { 
    ... 
} 

等同於:

for x in (&vec.rev()).into_iter() { 
    ... 
} 

即有沒有機會嘗試調用Iterator方法之前使用IntoIterator

3

這只是&運算符的基本優先級。在第一種情況下,每個方法被調用依次爲:

vec.iter().rev() 
(vec.iter()).rev() // same 

第二種情況下,&結合所有的方法後:

&vec.rev() 
&(vec.rev()) // same 

一般來說,使用&vec的時候可以,但是當你需要使用迭代器適配器方法,使用iterinto_iter