Ahhoz, hogy megértsd a collect függvényt, fontos tudni, hogy egy iterátor feloldására szolgál. Emlékezz rá, hogy az iterátor elemek sorozata, amely más iterátorokkal láncolható össze. Az iterátorok lusták, ami azt jelenti, hogy nem futnak le addig, amíg nem hívsz meg olyan kódot, amely fogyasztja az iterátort. Ilyen kód például a for ciklus és a fogyasztó adaptorok. A fogyasztó adaptorok az iterátor összes elemét feldolgozzák, hogy valamilyen kimenetet állítsanak elő.
A collect egy ilyen fogyasztó adaptor, amellyel bármely olyan típus példányát előállíthatod, amely megvalósítja a FromIterator traitet. Ezt a traitet a szabványos könyvtár összes gyűjteménye megvalósítja. Mivel a FromIterator sok típusra meg van valósítva, meg kell mondanod a Rustnak, milyen gyűjteményt szeretnél. Ha például egy string szeletből Vec<char>-t szeretnénk, beírhatjuk a típust a collect hívásába így:
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<_>>();
A dupla kettőspont és a külső csúcsos zárójelek (azaz ::<_>) neve turbofish. Ebben az esetben a turbofish szintaxisa zajosabb a kelleténél. Ha magán a kötésen adjuk meg a típust, a collect kevesebb szintaktikai zajjal tudja kikövetkeztetni, milyen gyűjteményt hozzon létre.
let my_chars: Vec<char> = "Hello, World!".chars().collect();
// or
// let my_chars: Vec<_> = "Hello, World!".chars().collect();
Ha fordított karakterekkel rendelkező String-et szeretnénk, így tehetnénk:
let rev_chars: String = "Hello, World!".chars().rev().collect();
A Rust típuskövetkeztetése elég erős ahhoz, hogy néha nincs szükség külön típusmegjelölésre:
fn get_reversed_chars(phrase: &str) -> Vec<char> {
phrase.chars().rev().collect()
}
A get_reversed_chars függvény visszatérési típusa alapján a collect függvény ki tudja következtetni, milyen gyűjteményt adjon vissza. Itt azonban Vec<char>-t kell megadnunk, nem Vec<_>-t, mert a Rust nem végez típuskövetkeztetést a függvényszignatúrákban. Ez biztosítja, hogy a kódot olvasó gyorsan lássa, milyen típusokat fogad és ad vissza egy függvény.