Ітератор

Трейт Iterator підтримує ітерацію над значеннями у колекції. Він вимагає наявності методу next і надає багато методів. Багато стандартних бібліотечних типів реалізують Iterator, і ви також можете реалізувати його самостійно:

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.
  • Трейт Iterator реалізує багато поширених функціональних операцій програмування над колекціями (наприклад, map, filter, reduce і т.д.). Це цій трейт, де ви можете знайти всю документацію про них. У Rust ці функції мають створювати код, який є настільки ж ефективним, як і еквівалентні імперативні реалізації.

  • IntoIterator — це трейт, яка забезпечує роботу циклів for. Він реалізований такими типами колекцій, як Vec<T>, і посиланнями на них, наприклад &Vec<T> і &[T]. Діапазони також реалізують його. Ось чому ви можете перебирати вектор з for i in some_vec { .. }, але some_vec.next() не існує.