Rust 迭代器
Iterator trait、惰性适配器、消费者与 collect;零成本抽象下的集合处理主路径。
#type / concept
#status / growing
#tech / dev
#resource / rust
[!info] 关联笔记
Rust 迭代器
这个概念为什么出现
处理集合的标准方式不应是满屏下标。
Iterator 把“如何产生下一个元素”抽象出来,适配器(map/filter)惰性组合,消费者(collect/sum)触发执行。
[!abstract] 一句话理解 实现
Iterator的类型可产生一系列Item;适配器惰性变换流;collect等消费者强制求值。
最小可运行示例
场景:订单金额——筛选大额并计算税费后总额
财务任务:金额列表中筛 >=100 的订单,加 10% 税后求和。
// 业务意图:筛选大额订单并计税汇总。
// 教学点:iter/map/filter/sum 惰性链;闭包捕获。
fn main() {
let amounts = [50_u32, 120, 80, 200];
let taxed_total: u32 = amounts
.iter()
.copied()
.filter(|a| *a >= 100)
.map(|a| a + a / 10) // +10%
.sum();
println!("taxed_total={taxed_total}");
}
建议运行:cargo run
期望输出:
taxed_total=352
(120→132,200→220,和 352)
结合场景再看三个关注点
- 中间步骤不建临时 Vec(直到需要)
- 可读的数据管道
- 类型由
sum/collect注解引导
核心概念与准确模型
trait Iterator {
type Item;
fn next(&mut self) -> Option<Self::Item>;
}
iter:&Titer_mut:&mut Tinto_iter:T
适配器返回新迭代器;不 next/collect 则几乎不干活。
设计动机
- 统一遍历协议
- 优化友好的惰性融合(实现可优化)
- 函数式表达力 + 系统性能
边界与误区
- 忘了消费者导致“没执行”
- 在迭代同一集合时修改结构需遵守借用
- 无限迭代器要
take
[!warning] 常见误区:以为 map 立刻生成新 Vec 默认惰性;
collect才物化。
工程实践
- 优先迭代器链表达变换
- 热路径看汇编/基准,不盲信
- 复杂链抽函数命名
- 错误用
collect::<Result<Vec<_>,_>>()模式
本节总结
- Iterator + 适配器 + 消费者
- 惰性默认
- 与闭包深度结合
自测题
iter与into_iter区别?- 为何需要
collect类型注解?
参考答案
- 借用 vs 拿走元素。
- 可收集进多种目标类型,编译器需知道目标。
延伸阅读与资料来源
| 资料 | 类型 | 支撑内容 |
|---|---|---|
| The Book — Iterators | 官方书 | 迭代器 |
| std::iter::Iterator | 标准库 | API |