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)

结合场景再看三个关注点

  1. 中间步骤不建临时 Vec(直到需要)
  2. 可读的数据管道
  3. 类型由 sum/collect 注解引导

核心概念与准确模型

trait Iterator {
    type Item;
    fn next(&mut self) -> Option<Self::Item>;
}
  • iter&T
  • iter_mut&mut T
  • into_iterT

适配器返回新迭代器;不 next/collect 则几乎不干活。

设计动机

  • 统一遍历协议
  • 优化友好的惰性融合(实现可优化)
  • 函数式表达力 + 系统性能

边界与误区

  • 忘了消费者导致“没执行”
  • 在迭代同一集合时修改结构需遵守借用
  • 无限迭代器要 take

[!warning] 常见误区:以为 map 立刻生成新 Vec 默认惰性;collect 才物化。

工程实践

  1. 优先迭代器链表达变换
  2. 热路径看汇编/基准,不盲信
  3. 复杂链抽函数命名
  4. 错误用 collect::<Result<Vec<_>,_>>() 模式

本节总结

  • Iterator + 适配器 + 消费者
  • 惰性默认
  • 与闭包深度结合

自测题

  1. iterinto_iter 区别?
  2. 为何需要 collect 类型注解?
参考答案
  1. 借用 vs 拿走元素。
  2. 可收集进多种目标类型,编译器需知道目标。

延伸阅读与资料来源

资料类型支撑内容
The Book — Iterators官方书迭代器
std::iter::Iterator标准库API
创建于 2026/7/15 更新于 2026/7/15