2016-09-29 5 views
8

यह काम करता है क्योंकि Iterator लागू करता rev() जहां self एक DoubleEndedIterator है:रिवर्स बार-बार दोहराना एक और vec बनाम 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` 

लेकिन परोक्ष IntoIterator फोन पाश के लिए नहीं एक है? &vec या vec.iter() बेवकूफ जंग माना जाता है?

उत्तर

11

यदि आप Vec पर लूपिंग कर रहे हैं, तो &vec बेवकूफ है। यह काम करता है क्योंकि &Vec<T>IntoIterator लागू करता है, जो कि लूप का उपयोग करता है।

लेकिन अगर आप इस तरह के rev, filter, आदि के रूप Iterator तरीकों कॉल करना चाहते हैं, तो आप एक वास्तविक 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 का उपयोग जब आप कर सकते हैं, लेकिन जब आप की जरूरत इटरेटर एडाप्टर विधियों का उपयोग करने के लिए, iter या into_iter का उपयोग करें।

संबंधित मुद्दे