2016-04-17 25 views
7

क्या यह कहना सही है कि एक वेक्टर (अन्य संग्रह प्रकारों के बीच) Iterator है?जंग में, एक वेक्टर एक इटरेटर है?

उदाहरण के लिए

, मैं कर सकते हैं निम्नलिखित तरीके से एक वेक्टर से अधिक पाश, क्योंकि यह Iterator विशेषता (मैं यह समझ के रूप में) लागू करता है:

let v = vec![1, 2, 3, 4, 5]; 

for x in &v { 
    println!("{}", x); 
} 

हालांकि, अगर मैं कार्यों का हिस्सा हैं का उपयोग करना चाहते Iterator विशेषता (जैसे fold, map या filter) मुझे पहले वेक्टर पर iter() क्यों कॉल करना चाहिए?

एक और विचार मैंने किया था कि एक वेक्टर को Iterator में परिवर्तित किया जा सकता है, और उस स्थिति में, उपरोक्त वाक्यविन्यास अधिक समझ में आता है।

+1

https://doc.rust-lang.org/book/iterators.html x में v.iter() 'में x के लिए 'x in & v' बनाम' के बारे में कुछ सामान कहता है, जो भी मान्य है। मुझे जंग (अभी तक) नहीं पता है, इसलिए मैं वास्तव में इसे समझा नहीं सकता या संक्षेप में नहीं कर सकता, यद्यपि! –

उत्तर

20

नहीं, एक वेक्टर एक पुनरावर्तक नहीं है।

लेकिन यह IntoIterator विशेषता का उपयोग करता है, जो for लूप वेक्टर को आवश्यक इटरेटर में परिवर्तित करने के लिए उपयोग करता है।

documentation for Vec में आप देख सकते हैं कि IntoIterator तीन तरीकों से कार्यान्वित किया जाता है:, Vec<T> के लिए जो ले जाया जाता है और इटरेटर प्रकार T के आइटम देता है, एक साझा संदर्भ &Vec<T>, जहां इटरेटर रिटर्न संदर्भ &T साझा के लिए, और &mut Vec<T> के लिए , जहां परिवर्तनीय संदर्भ लौटाए जाते हैं।

iter()Vec में सिर्फ एक विधि Vec<T> सीधे पुनरावर्तक उस साझा किए गए संदर्भ रिटर्न में परिवर्तित करने के लिए, पहले यह एक संदर्भ में परिवर्तित करने के बिना है। उत्परिवर्ती संदर्भों के उत्पादन के लिए एक भाई विधि iter_mut() है।

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