Day 3:迭代器與迭代器適配器
學習目標
- 建立迭代器(iter / into_iter / iter_mut)
- 用 map / filter / collect 組合
- 了解惰性求值
今日重點
三種迭代方式
let v = vec![1, 2, 3];
for x in &v { // iter:借用,x: &i32
println!("{}", x);
}
for x in &mut v { // iter_mut:可變借用,x: &mut i32
*x += 1;
}
for x in v { // into_iter:取得所有權,x: i32
println!("{}", x);
}
// 用 v.iter() 也是借用的迭代
迭代器適配器(組合)
let v = vec![1, 2, 3];
// map:轉換
let v2: Vec<_> = v.iter().map(|x| x + 1).collect();
// -> [2, 3, 4]
// filter:過濾
let v3: Vec<_> = v.iter().filter(|&&x| x % 2 == 0).collect();
// fold:累加(reduce)
let sum = v.iter().fold(0, |acc, &x| acc + x);
// chain:串接
let v4: Vec<_> = v.iter().chain([9, 10].iter()).collect();
惰性求值
迭代器**只有在被消費時(collect、for、sum、find 等)才真正運算**。map/filter 本身不會立即執行。
練習
let numbers = vec![1, 2, 3, 4, 5, 6];
// 1. 平方數再只留偶數,收集成 Vec
let result: Vec<_> = numbers.iter().map(|x| x * x).filter(|x| x % 2 == 0).collect();
println!("{:?}", result); // [4, 16, 36]
// 2. 用 fold 求 1..=10 的總和
// 3. 用 sum 直接求和
自我檢查
- 分辨 iter / iter_mut / into_iter
- 會用 map、filter、fold、collect
- 理解惰性求值
- 理解 filter 裡
|&&x|的雙重參考
深入連結
- The Book 第 13 章「Iterator Adaptors」