Iteradores personalizados
Implemente Iterator
Iteradores personalizados é uma aula grátis de Learn Rust Coding no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Learn Rust Coding, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Learn Rust Coding inclui 4 aulas no total.
Crie seu próprio iterador
Você não está limitado aos iteradores integrados. Ao implementar a característica Iterator no seu próprio tipo, ele passa a ter todos os adaptadores e consumidores gratuitamente.
Tudo o que você precisa fornecer é o tipo Item e um método next.
Uma estrutura Counter
Comece com uma estrutura que armazene o estado do iterador. Um contador simples precisa apenas de um valor atual.
struct Counter {
count: u32,
}
fn main() {
let c = Counter { count: 0 };
println!("start at {}", c.count);
}Implementando next
Implemente Iterator para a estrutura. Defina type Item e depois escreva next para avançar o estado e retornar Some até uma condição de parada; depois, retorne None.
struct Counter { count: u32 }
impl Iterator for Counter {
type Item = u32;
fn next(&mut self) -> Option<u32> {
if self.count < 5 {
self.count += 1;
Some(self.count)
} else {
None
}
}
}
fn main() {
let mut c = Counter { count: 0 };
println!("{:?}", c.next());
println!("{:?}", c.next());
}Usando-o em um loop
Assim que next existir, seu tipo funcionará em um loop for, assim como qualquer iterador padrão.
struct Counter { count: u32 }
impl Iterator for Counter {
type Item = u32;
fn next(&mut self) -> Option<u32> {
if self.count < 5 { self.count += 1; Some(self.count) } else { None }
}
}
fn main() {
for n in (Counter { count: 0 }) {
print!("{} ", n);
}
println!();
}Adaptadores e consumidores gratuitos
Como você implementou um método, todo o conjunto de ferramentas de iteradores agora está disponível. Aqui, somamos os quadrados de valores emparelhados de um contador.
struct Counter { count: u32 }
impl Iterator for Counter {
type Item = u32;
fn next(&mut self) -> Option<u32> {
if self.count < 5 { self.count += 1; Some(self.count) } else { None }
}
}
fn main() {
let total: u32 = Counter { count: 0 }.map(|x| x * 2).sum();
println!("{}", total);
}Um método construtor
Adicione uma função new para que os usuários não precisem acessar os campos internos diretamente. Isso é mais limpo e permite manter o campo privado.
struct Counter { count: u32 }
impl Counter {
fn new() -> Counter { Counter { count: 0 } }
}
impl Iterator for Counter {
type Item = u32;
fn next(&mut self) -> Option<u32> {
if self.count < 3 { self.count += 1; Some(self.count) } else { None }
}
}
fn main() {
let v: Vec<u32> = Counter::new().collect();
println!("{:?}", v);
}Um iterador de Fibonacci
Os iteradores podem manter estados mais complexos. Um gerador de Fibonacci mantém os dois últimos valores e os atualiza a cada chamada de next.
struct Fib { a: u64, b: u64 }
impl Iterator for Fib {
type Item = u64;
fn next(&mut self) -> Option<u64> {
let current = self.a;
self.a = self.b;
self.b = current + self.b;
Some(current)
}
}
fn main() {
let fib = Fib { a: 0, b: 1 };
let seq: Vec<u64> = fib.take(8).collect();
println!("{:?}", seq);
}Iteradores infinitos são válidos
O iterador de Fibonacci nunca retorna None — ele é infinito. Isso é seguro porque a execução preguiçosa faz com que os valores sejam produzidos somente quando solicitados. Use take para limitá-lo.
struct Fib { a: u64, b: u64 }
impl Iterator for Fib {
type Item = u64;
fn next(&mut self) -> Option<u64> {
let c = self.a;
self.a = self.b;
self.b = c + self.b;
Some(c)
}
}
fn main() {
let big = Fib { a: 0, b: 1 }.nth(20);
println!("{:?}", big);
}Iterando sobre um tipo envoltório
Frequentemente, você implementa Iterator em uma estrutura auxiliar que toma seus dados emprestados. Aqui, um iterador de passos produz todos os segundos números de um intervalo armazenado internamente.
struct EvenUpTo { current: u32, max: u32 }
impl Iterator for EvenUpTo {
type Item = u32;
fn next(&mut self) -> Option<u32> {
if self.current > self.max { return None; }
let value = self.current;
self.current += 2;
Some(value)
}
}
fn main() {
let evens: Vec<u32> = (EvenUpTo { current: 0, max: 10 }).collect();
println!("{:?}", evens);
}Por que criar iteradores personalizados?
Os iteradores personalizados permitem transmitir valores sem alocar uma coleção completa, modelar sequências infinitas ou calculadas e oferecer aos chamadores uma interface familiar e combinável.
Um pequeno método next desbloqueia todo o ecossistema.
Dicas de projeto
Mantenha o estado mínimo, retorne None exatamente uma vez ao final (ou nunca, no caso dos iteradores infinitos) e evite trabalho pesado dentro de next para que a execução preguiçosa continue barata.
Verificação rápida
Implementação da característica Iterator.
Recapitulação
Você criou iteradores personalizados:
- Armazene o estado em uma estrutura e depois use
impl Iterator - Defina
type Iteme escrevanext - Você obtém imediatamente adaptadores e consumidores gratuitamente
- Os iteradores podem ser finitos ou infinitos; use
takepara limitar os infinitos
Perguntas Frequentes
A aula “Iteradores personalizados” é grátis?
Sim — o texto completo de “Iteradores personalizados” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Learn Rust Coding, atualize para CoddyKit PRO. O curso de Learn Rust Coding inclui 4 aulas no total.
O que vou aprender em “Iteradores personalizados”?
Implemente Iterator Você pratica Learn Rust Coding com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Learn Rust Coding?
Nenhuma experiência prévia é necessária. Learn Rust Coding no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.
Quanto tempo leva a aula “Iteradores personalizados”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Learn Rust Coding?
Sim. Cada aula de Learn Rust Coding inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- A característica Iterator
- map, filter, collect
- Adaptadores e consumidores
- Iteradores personalizados