Iterator

ویژگی '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 بسیاری از عملیات برنامه‌نویسی تابعی رایج را روی collectionها پیاده‌سازی می‌کند (مانند map, filter, reduce,و غیره). این ویژگی است که در آن می‌توانید تمام اسناد مربوط به آنها را پیدا کنید. در Rust، این توابع باید کد را به اندازه پیاده‌سازی‌های ضروری معادل تولید کنند.

  • IntoIterator ویژگی است که باعث می‌شود حلقه‌ها کار کنند. این مجموعه (collection) توسط تایپ‌های مجموعه مانند Vec<T> و ارجاعاتی به آنها مانند &Vec<T> و &[T] پیاده‌سازی می‌شود. Ranges نیز آن ‌هارا اجرا می‌کند. به همین دلیل است که می‌توانید روی یک بردار با برای i در some_vec { .. } تکرار کنید، اما درنهایت some_vec.next()وجود ندارد.