diff --git a/src/SUMMARY.md b/src/SUMMARY.md index 495bb373..bc924fb0 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -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) diff --git a/src/iterators/collect.md b/src/iterators/collect.md new file mode 100644 index 00000000..f976db32 --- /dev/null +++ b/src/iterators/collect.md @@ -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::>(); + println!("prime_squares: {prime_squares:?}"); +} +``` + +
+ +- 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::()`, 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>` into a + `Result, 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. + +
+ +[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 diff --git a/src/iterators/fromiterator.md b/src/iterators/fromiterator.md deleted file mode 100644 index f9419a5f..00000000 --- a/src/iterators/fromiterator.md +++ /dev/null @@ -1,42 +0,0 @@ ---- -minutes: 5 ---- - -# FromIterator - -[`FromIterator`][1] 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::>(); - println!("prime_squares: {prime_squares:?}"); -} -``` - -
- -`Iterator` implements - -```rust,ignore -fn collect(self) -> B -where - B: FromIterator, - Self: Sized -``` - -There are two ways to specify `B` for this method: - -- With the "turbofish": `some_iterator.collect::()`, 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. - -There are basic implementations of `FromIterator` for `Vec`, `HashMap`, etc. -There are also more specialized implementations which let you do cool things -like convert an `Iterator>` into a `Result, E>`. - -
- -[1]: https://doc.rust-lang.org/std/iter/trait.FromIterator.html -[2]: https://doc.rust-lang.org/std/iter/trait.Iterator.html