1
0
mirror of https://github.com/google/comprehensive-rust.git synced 2025-05-25 11:50:17 +02:00
Dustin J. Mitchell 9f67c9b0e7
Adjust morning-session timings downward (#1786)
Based on feedback from @marshallpierce that mornings took about 2.5
hours, this adjusts a bunch of the morning times downward to try to
match that. In other words, this is trying to make the times in the
course more accurate, rather than reducing the amount of time available
for these slides.

This also updates the `course-schedule` tool to be able to show
per-segment timings.
2024-02-06 15:48:56 -05:00

51 lines
1.4 KiB
Markdown

---
minutes: 5
---
# `Iterator`
The [`Iterator`][1] trait supports iterating over values in a collection. It
requires a `next` method and provides lots of methods. Many standard library
types implement `Iterator`, and you can implement it yourself, too:
```rust,editable
struct Fibonacci {
curr: u32,
next: u32,
}
impl Iterator for Fibonacci {
type Item = u32;
fn next(&mut self) -> Option<Self::Item> {
let new_next = self.curr + self.next;
self.curr = self.next;
self.next = new_next;
Some(self.curr)
}
}
fn main() {
let fib = Fibonacci { curr: 0, next: 1 };
for (i, n) in fib.enumerate().take(5) {
println!("fib({i}): {n}");
}
}
```
<details>
- The `Iterator` trait implements many common functional programming operations
over collections (e.g. `map`, `filter`, `reduce`, etc). This is the trait
where you can find all the documentation about them. In Rust these functions
should produce the code as efficient as equivalent imperative implementations.
- `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. This is why you can iterate over a vector
with `for i in some_vec { .. }` but `some_vec.next()` doesn't exist.
</details>
[1]: https://doc.rust-lang.org/std/iter/trait.Iterator.html