Skip to content

Commit

Permalink
Reframe FromIterator slide to focus on collect (#2516)
Browse files Browse the repository at this point in the history
  • Loading branch information
randomPoison authored Dec 16, 2024
1 parent 4663ec8 commit fe55425
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 43 deletions.
2 changes: 1 addition & 1 deletion src/SUMMARY.md
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,7 @@
- [Iterators](iterators.md)
- [`Iterator`](iterators/iterator.md)
- [`IntoIterator`](iterators/intoiterator.md)
- [`FromIterator`](iterators/fromiterator.md)
- [`collect`](iterators/collect.md)
- [Exercise: Iterator Method Chaining](iterators/exercise.md)
- [Solution](iterators/solution.md)
- [Modules](modules.md)
Expand Down
48 changes: 48 additions & 0 deletions src/iterators/collect.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
---
minutes: 5
---

# `collect`

The [`collect`][3] method lets you build a collection from an [`Iterator`][2].

```rust,editable
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:?}");
}
```

<details>

- Any iterator can be collected in to a `Vec`, `VecDeque`, or `HashSet`.
Iterators that produce key-value pairs (i.e. a two-element tuple) can also be
collected into `HashMap` and `BTreeMap`.

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 the `Vec` 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`][1] trait, which defines how each type of collection gets
built from an iterator.
- In addition to the basic implementations of `FromIterator` for `Vec`,
`HashMap`, etc., there are also more specialized implementations which let you
do cool things like convert an `Iterator<Item = Result<V, E>>` into a
`Result<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.

</details>

[1]: https://doc.rust-lang.org/std/iter/trait.FromIterator.html
[2]: https://doc.rust-lang.org/std/iter/trait.Iterator.html
[3]: https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.collect
42 changes: 0 additions & 42 deletions src/iterators/fromiterator.md

This file was deleted.

0 comments on commit fe55425

Please sign in to comment.