1
0
mirror of https://github.com/google/comprehensive-rust.git synced 2024-12-12 13:25:23 +02:00

Merge pull request #169 from google/intoiterator

Add some speaker notes for day 3 morning and a page about FromIterator
This commit is contained in:
Andrew Walbran 2023-01-16 21:31:09 +00:00 committed by GitHub
commit b602dc9be4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 65 additions and 6 deletions

View File

@ -129,6 +129,7 @@
- [Default Methods](traits/default-methods.md) - [Default Methods](traits/default-methods.md)
- [Important Traits](traits/important-traits.md) - [Important Traits](traits/important-traits.md)
- [`Iterator`](traits/iterator.md) - [`Iterator`](traits/iterator.md)
- [`FromIterator`](traits/from-iterator.md)
- [`From` and `Into`](traits/from-into.md) - [`From` and `Into`](traits/from-into.md)
- [`Read` and `Write`](traits/read-write.md) - [`Read` and `Write`](traits/read-write.md)
- [`Add`, `Mul`, ...](traits/operators.md) - [`Add`, `Mul`, ...](traits/operators.md)

View File

@ -19,3 +19,20 @@ fn main() {
println!("mul_5: {}", apply_with_log(mul_5, 20)); println!("mul_5: {}", apply_with_log(mul_5, 20));
} }
``` ```
<details>
If you have an `FnOnce`, you may only call it once. It might consume captured values.
An `FnMut` might mutate captured values, so you can call it multiple times but not concurrently.
An `Fn` neither consumes nor mutates captured values, or perhaps captures nothing at all, so it can
be called multiple times concurrently.
`FnMut` is a subtype of `FnOnce`. `Fn` is a subtype of `FnMut` and `FnOnce`. I.e. you can use an
`FnMut` wherever an `FnOnce` is called for, and you can use an `Fn` wherever an `FnMut` or `FnOnce`
is called for.
`move` closures only implement `FnOnce`.
</details>

View File

@ -18,3 +18,14 @@ fn main() {
* `impl Trait` cannot be used with the `::<>` turbo fish syntax. * `impl Trait` cannot be used with the `::<>` turbo fish syntax.
* `impl Trait` allows you to work with types which you cannot name. * `impl Trait` allows you to work with types which you cannot name.
<details>
The meaning of `impl Trait` is a bit different in the different positions.
* For a parameter, `impl Trait` is like an anonymous generic parameter with a trait bound.
* For a return type, it means that the return type is some concrete type that implements the trait,
without naming the type. This can be useful when you don't want to expose the concrete type in a
public API.
</details>

View File

@ -54,13 +54,13 @@ Memory layout after allocating `xs`:
: | | '---->| "<str as Display>::fmt" | : : | | '---->| "<str as Display>::fmt" | :
: | | +-------------------------+ : : | | +-------------------------+ :
: | | : : | | :
: | | +-------------------------+ : : | | +----+----+----+----+ :
: | '-->| "<i32 as Display>::fmt" | : : | '-->| 7b | 00 | 00 | 00 | :
: | +-------------------------+ :
: | :
: | +----+----+----+----+ : : | +----+----+----+----+ :
: '---->| 7b | 00 | 00 | 00 | : : | :
: +----+----+----+----+ : : | +-------------------------+ :
: '---->| "<i32 as Display>::fmt" | :
: +-------------------------+ :
: : : :
: : : :
'- - - - - - - - - - - - - - - - - - - - - - - -' '- - - - - - - - - - - - - - - - - - - - - - - -'

View File

@ -0,0 +1,23 @@
# FromIterator
`FromIterator` lets you build a collection from an `Iterator`.
```rust,editable
fn main() {
let primes = vec![2, 3, 5, 7];
let prime_squares = primes.into_iter().map(|prime| prime * prime).collect::<Vec<_>>();
}
```
<details>
`Iterator` implements
`fn collect<B>(self) -> B
where
B: FromIterator<Self::Item>,
Self: Sized`
There are also implementations which let you do cool things like convert an
`Iterator<Item = Result<V, E>>` into a `Result<Vec<V>, E>`.
</details>

View File

@ -26,3 +26,10 @@ fn main() {
} }
} }
``` ```
<details>
`IntoIterator` is the trait that makes for loops work. It is implemented by collection types such as
`Vec<T>` and references to them such as `&Vec<T>` and `&[T]`. Ranges also implement it.
</details>