collect
The collect
method lets you build a collection from an Iterator
.
fn main() { let primes = vec![2, 3, 5, 7]; let prime_squares = primes.into_iter().map(|p| p * p).collect::<Vec<_>>(); println!("prime_squares: {prime_squares:?}"); }
This slide should take about 5 minutes.
- Any iterator can be collected in to a
Vec
,VecDeque
, orHashSet
. Iterators that produce key-value pairs (i.e. a two-element tuple) can also be collected intoHashMap
andBTreeMap
.
Show the students the definition for collect
in the standard library docs.
There are two ways to specify the generic type B
for this method:
- With the "turbofish":
some_iterator.collect::<COLLECTION_TYPE>()
, as shown. The_
shorthand used here lets Rust infer the type of theVec
elements. - With type inference:
let prime_squares: Vec<_> = some_iterator.collect()
. Rewrite the example to use this form.
More to Explore
- If students are curious about how this works, you can bring up the
FromIterator
trait, which defines how each type of collection gets built from an iterator. - In addition to the basic implementations of
FromIterator
forVec
,HashMap
, etc., there are also more specialized implementations which let you do cool things like convert anIterator<Item = Result<V, E>>
into aResult<Vec<V>, E>
. - The reason type annotations are often needed with
collect
is because it's generic over its return type. This makes it harder for the compiler to infer the correct type in a lot of cases.