结论:Rust 迭代器是惰性的——map、filter 等适配器只构造一个记录变换逻辑的新迭代器,不执行任何计算;只有遇到 collect、sum、for 循环这类消费器时才真正逐个求值。collect 就是"把迭代器消费掉并收集成集合"的通用消费器。
展开:惰性带来两个好处:1)中间结果不落盘,链式调用 v.iter().map(f).filter(g) 编译后通常融合成单趟循环,无中间集合分配,即零成本抽象;2)支持无限序列(0..),只在消费时取需要的部分。collect 靠泛型 B: FromIterator<A> 工作,目标类型常需标注:写成 let xs: Vec<_> = ...collect() 或 turbofish collect::<Vec<_>>()。
let v = vec![1, 2, 3, 4];
let it = v.iter().map(|x| x * 2); // 什么都没算
let doubled: Vec<_> = it.filter(|x| *x > 4).collect(); // 6, 8
let total: i32 = v.iter().sum(); // 消费器
易错点:忘记消费导致"逻辑写了但没执行"(编译器会以 must_use 警告);iter/iter_mut/into_iter 分别产生 &T、&mut T、T,for 循环对 Vec 默认走 into_iter(消耗所有权)。追问方向:手写 Iterator trait、collect 到 Result<Vec<T>, E> 的短路收集。