LAZY PIPELINE / 按需生产

你不催,流水线就真的不动

下面这条链看着写了五步,但 filtermap 并不会抢跑。直到 collect 请求一个结果,调用才会从右向左传到源头,再把一个候选值从左向右送过每道关卡。

按“推进一个微步骤”,留意右侧消费器如何向上游要数据。有时为了凑出一个结果,源头得连续尝试好几个数。

(1..=10) .filter(|x| x % 2 == 1) .map(|x| x * x) .skip(2) .take(3) .collect::<Vec<_>>()
尚未消费
collect 的拉取请求

链条已搭好,但没有任何闭包被调用。

结果 0 / 3
GATE 01

filter

奇数放行;偶数就地退回,不会进入后续。

等待候选
TOOL 02

map

只转换放行的值:把它平方。

等待输入
BUFFER 03

skip(2)

丢掉前两个“平方后的结果”,不是前两个源元素。

已跳过 0 / 2
LIMIT 04

take(3)

交付第三个结果后,整条链就停止索取。

已交付 0 / 3
SINK 05

collect

消费器持有目标类型,把每次拉到的值装进 Vec。

Vec<i32> = []
源数据:1..=10 颜色会记录每个值的去向
最终托盘 Vec<i32>
还没有值;适配器目前只是一份计划。
适配器只改“下一次怎么取”

mapfilterskip 返回新的迭代器;搭链时不遍历数据。

执行是一个值一个值穿过

不是先筛出完整数组,再把完整数组平方。中间结果通常不需要单独落地。

下游决定上游做多少

take(3) 一旦拿够三个结果就不再索取,所以 10 根本不会被检查。