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」