Ітератор
Трейт 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}"); } }
-
Трейт
Iterator
реалізує багато поширених функціональних операцій програмування над колекціями (наприклад,map
,filter
,reduce
і т.д.). Це цій трейт, де ви можете знайти всю документацію про них. У Rust ці функції мають створювати код, який є настільки ж ефективним, як і еквівалентні імперативні реалізації. -
IntoIterator
— це трейт, яка забезпечує роботу циклів for. Він реалізований такими типами колекцій, якVec<T>
, і посиланнями на них, наприклад&Vec<T>
і&[T]
. Діапазони також реалізують його. Ось чому ви можете перебирати вектор зfor i in some_vec { .. }
, алеsome_vec.next()
не існує.