结论:Rust 迭代器是惰性的——mapfilter 等适配器只构造一个记录变换逻辑的新迭代器,不执行任何计算;只有遇到 collectsumfor 循环这类消费器时才真正逐个求值。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 TT,for 循环对 Vec 默认走 into_iter(消耗所有权)。追问方向:手写 Iterator trait、collectResult<Vec<T>, E> 的短路收集。