Iterator

O trait Iterator suporta a iteração sobre valores em uma coleção. Ele requer um método next e fornece muitos métodos. Muitos tipos da biblioteca padrão implementam Iterator, e você também pode implementá-lo:

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}");
    }
}
This slide should take about 5 minutes.
  • O trait Iterator implementa muitas operações comuns de programação funcional sobre coleções (por exemplo, map, filter, reduce, etc). Este é o trait onde você pode encontrar toda a documentação sobre eles. Em Rust, essas funções devem produzir o código tão eficiente quanto as implementações imperativas equivalentes.

  • IntoIterator é o trait que faz os laços for funcionarem. Ele é implementado por tipos de coleção como Vec<T> e referências a eles como &Vec<T> e &[T]. Intervalos (ranges) também o implementam. É por isso que você pode iterar sobre um vetor com for i in some_vec { .. }, mas some_vec.next() não existe.