1. 程式人生 > 資訊 >13.58 ~ 16.28 萬元,2022 款比亞迪宋 Pro DM-i 開啟預售:百公里加速 7.9 秒

13.58 ~ 16.28 萬元,2022 款比亞迪宋 Pro DM-i 開啟預售:百公里加速 7.9 秒

迭代器

迭代器是惰性的,呼叫方法使用迭代器之前,不會有任何的效果。

每個迭代器都實現了iterator trait,這個 trait 定義在標準庫裡。

trait Iterator {
    type Item;
    // type Item和Self::Item這種用法叫做定義trait的關聯型別。這裡只定義了這個函式,並沒有實現,如果使用自定義迭代器的話,就要在這裡的重寫next方法。
    fn next(&mut self) -> Option<Self::Item>;
}

fn iter_check() {
    let v1 = vec![1, 2, 3];
    let mut v1_iter = v1.iter();

    if let Some(v) = v1_iter.next() {
        println!("{}", v);
    } else {
        println!("end")
    }
}

next 方法是被要求實現的唯一的一個方法,next一次返回一個元素,當迭代器結束的時候返回None。

迭代可變引用

fn iter_check_mut() {
    // 通過迭代的方法修改列表
    let mut v2 = vec![1, 2, 3];
    let mut v2_iter = v2.iter_mut();
    if let Some(v) = v2_iter.next() {
        *v = 3
    }
    println!("{:?}", v2_iter)
}

自定義迭代器

struct Counter {
    count: u32,
}

impl Counter {
    fn new() -> Counter {
        Counter {count: 0, }
    }
}

impl Iterator for Counter {

    type Item = u32;
    fn next(&mut self) -> Option<Self::Item> {
        self.count += 1;
        if self.count < 6 {
            Some(self.count)
        } else {
            None
        }
    }
    
}

fn main() {
    let mut counter = Counter::new();
    for i in (0..6) {
        if let Some(v) = counter.next() {
            println!("{} {}", i, v);
        } else {
            println!("{}", i);
            break;
        }
    }
    println!("Hello, world!");
}