O Trait Iterator
Iterator requer fn next(&mut self) -> Option<Self::Item>. Adaptadores encadeiam preguiçosamente até o consumo.
Receita
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}");
}Quando usar: Sequências personalizadas, parsers e pipelines preguiçosos.
Exemplo de Trabalho
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)
}
}O que isso demonstra:
- Iterador de empréstimo sobre
&str - Tipo associado
Item = &str - Estado manual em campos de struct
Análise Profunda
Iterator fornece métodos padrão: map, filter, fold, etc. IntoIterator habilita loops for.
Otimização size_hint é opcional. FusedIterator documenta o comportamento de fim.
Armadilhas
- Iterador infinito + collect - Trava. Correção: Limite
take(n). - Invalidação do iterador na fonte - Mutação de
Vecdurante a iteração. Correção: Coletar índices ou clonar. - Esquecer a preguiça
#[must_use]- Nenhum trabalho até o consumo. Correção: Atribuir a_ = iter.count()se intencional. - Iterador personalizado não fundido -
nextextra apósNonepode repetir. Correção: Documentar ou usarFusedIterator. - Iteradores de empréstimo GAT - Avançado - retorna itens emprestados com GAT
Item<'a>.
Alternativas
| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
Índice de loop for | Necessita vizinhos | Simples map/filter |
| Recursão | Árvores | Risco de pilha profunda |
Blocos gen (nightly) | Estilo gerador | Iterator personalizado estável |
FAQs
IntoIterator?
O loop for chama into_iter.iter vs into_iter?
Empréstimo vs posse.DoubleEndedIterator?
next_back para reverso.ExactSizeIterator?
len conhecido - otimizações.trait extend?
loop for push via Extend.flatten?
Iterador de iteradores.try_iterator?
Variantes falíveis.no_std?
core::iter.async iter?
Trait Stream em ecossistemas async.clippy?
manual_flatten etc.Relacionados
- Adaptadores de Iterador
- Consumindo Iteradores
- IntoIterator & Possuído vs Emprestado
- Tipos Associados
Versões da Pilha: Esta página foi escrita para Rust 1.97.0 (edição 2024), Tokio 1.x, Axum 0.8, serde 1.0, sqlx 0.8, clap 4, e Polars 0.46+.