The Iterator Trait
Iterator requires fn next(&mut self) -> Option<Self::Item>. Adapters chain lazily until consumption.
Busca en todas las páginas de la documentación
Iterator requires fn next(&mut self) -> Option<Self::Item>. Adapters chain lazily until consumption.
struct Counter { n: u32, max: u32 }
impl Iterator for Counter {
type Item = u32;
fn next(&mut self) -> Option<Self::Item> {
if self.n < self.max { let v = self.n; self.n += 1; Some(v) } else { None }
}
}
fn main() {
let sum: u32 = Counter { n: 0, max: 5 }.sum();
println!("{sum}");
}When to reach for this: Custom sequences, parsers, and lazy pipelines.
struct Lines<'a> { s: &'a str }
impl<'a> Iterator for Lines<'a> {
type Item = &'a str;
fn next(&mut self) -> Option<Self::Item> {
if self.s.is_empty() { return None; }
let (line, rest) = match self.s.find('\n') {
Some(i) => (&self.s[..i], &self.s[i + 1..]),
None => (self.s, ""),
};
self.s = rest;
Some(line)
}
}What this demonstrates:
&strItem = &strIterator provides default methods: map, filter, fold, etc. IntoIterator enables for loops.
size_hint optimization optional. FusedIterator documents end behavior.
take(n) bound.Vec while iterating it. Fix: Collect indices or clone.#[must_use] laziness - No work until consume. Fix: Assign to _ = iter.count() if intentional.next after None may repeat. Fix: Document or use FusedIterator.Item<'a>.| Alternative | Use When | Don't Use When |
|---|---|---|
for loop index | Need neighbors | Simple map/filter |
| Recursion | Trees | Deep stack risk |
gen blocks (nightly) | Generator style | Stable custom Iterator |
Stack versions: This page was written for Rust 1.97.0 (edition 2024), Tokio 1.x, Axum 0.8, serde 1.0, sqlx 0.8, clap 4, and Polars 0.46+.
Revisado por Chris St. John·Última actualización: 16 jul 2026