我想计算一个迭代器,对其进行过滤,并在一次迭代中收集过滤器。
我找不到任何零成本抽象可以让我做到这一点。使用循环我可以在单个循环中实现这一点。据我所知,使用迭代器适配器我需要两个循环。
我不知道这个高级 API 会是什么样子。类似于惰性折叠,以便在返回复合结果后应用适配器。
关于:
let mut counter = 0;
iterator.inspect(|_| counter += 1).filter(|v| /* condition */).collect();
作为一个功能性的书呆子,我会使用一个很好的旧
fold
:
let (count, filtered) = iterator.fold((0, Vec::new()), |(n, mut v), e| {
if /* condition */ { v.push(e); }
(n+1, v)
});