collect फंक्शन को समझने के लिए यह जानना ज़रूरी है कि इसका उपयोग किसी इटरेटर को हल करने के लिए किया जाता है। याद रखिए कि इटरेटर आइटम का एक क्रम होता है, जिसे दूसरे इटरेटर के साथ जोड़ा जा सकता है। इटरेटर लेज़ी होते हैं, यानी वे तब तक नहीं चलते जब तक आप ऐसा कोड कॉल नहीं करते जो इटरेटर को कंज़्यूम करता है। ऐसे कोड में for लूप और कंज़्यूम करने वाले अडैप्टर शामिल हैं। कंज़्यूम करने वाले अडैप्टर इटरेटर के सभी आइटम पर काम करके किसी तरह का आउटपुट बनाते हैं।
collect ऐसा ही एक कंज़्यूम करने वाला अडैप्टर है, जिसका उपयोग किसी भी ऐसे टाइप का इंस्टेंस बनाने के लिए किया जा सकता है जो FromIterator ट्रेट को लागू करता हो। यह ट्रेट स्टैंडर्ड लाइब्रेरी के सभी कलेक्शन के लिए लागू किया गया है। चूँकि FromIterator कई टाइप के लिए लागू किया गया है, इसलिए आपको Rust को बताना पड़ता है कि आप किस तरह का कलेक्शन चाहते हैं। उदाहरण के लिए, अगर हमें किसी स्ट्रिंग स्लाइस से एक Vec<char> चाहिए, तो हम collect को कॉल करते समय टाइप इस तरह लिख सकते हैं:
let my_chars = "Hello, World!".chars().collect::<Vec<char>>();
// since the item type of the `String::chars()` iterator can be inferred to be `char`, we can omit that information
// let my_chars = "Hello, World!".chars().collect::<Vec<_>>();
डबल कोलन और बाहरी एंगल ब्रैकेट (यानी ::<_>) को turbofish कहा जाता है। इस मामले में turbofish उससे ज़्यादा शोरगुल वाला सिंटैक्स है जितनी हमें ज़रूरत है। टाइप को बाइंडिंग पर ही बताने से collect कम सिंटैक्स शोर के साथ अनुमान लगा सकता है कि उसे कौन सा कलेक्शन बनाना है।
let my_chars: Vec<char> = "Hello, World!".chars().collect();
// or
// let my_chars: Vec<_> = "Hello, World!".chars().collect();
अगर हमें उलटे क्रम में अक्षरों वाली एक String चाहिए होती, तो हम यह इस तरह कर सकते थे:
let rev_chars: String = "Hello, World!".chars().rev().collect();
Rust का टाइप इन्फरेंस इतना शक्तिशाली है कि कभी-कभी हमें स्पष्ट इनलाइन नोट लिखने की ज़रूरत नहीं पड़ती:
fn get_reversed_chars(phrase: &str) -> Vec<char> {
phrase.chars().rev().collect()
}
get_reversed_chars फंक्शन का रिटर्न टाइप collect फंक्शन को यह अनुमान लगाने देता है कि उसे कौन सा कलेक्शन लौटाना है। यहाँ, हालाँकि, हमें Vec<char> बताना ज़रूरी है, Vec<_> नहीं, क्योंकि Rust फंक्शन सिग्नेचर के लिए टाइप इन्फरेंस नहीं करता। ऐसा इसलिए है ताकि कोड पढ़ने वाला व्यक्ति जल्दी से जान सके कि कोई फंक्शन कौन-कौन से टाइप लेता है और कौन-कौन से लौटाता है।