13.58 ~ 16.28 萬元,2022 款比亞迪宋 Pro DM-i 開啟預售:百公里加速 7.9 秒
阿新 • • 發佈:2021-11-30
迭代器
迭代器是惰性的,呼叫方法使用迭代器之前,不會有任何的效果。
每個迭代器都實現了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!"); }