我有一个迭代器适配器链(我不知道编译时有多少)应用于初始迭代器. 一个简化的示例是,根据数字的整除性筛选一系列数字,并获得末尾剩余数字的数量:
let n: usize = 10;
let mut iter_chain: Box<dyn std::iter::Iterator<Item = usize>> = Box::new(1..=n);
for i in 2..n {
iter_chain = Box::new(iter_chain.filter(move |j| j % i != 0));
}
println!("{}", iter_chain.count());
现在,我希望在这个过滤器链的每个stage个中都有count the numbers of elements个.
我的 idea 是在每个过滤器之间插入一个inspect
适配器,增加对应stage的计数器.
但是,每个inspect
适配器必须从循环外部的某个地方borrow 可变计数器.
这导致了对Vector的多次相互borrow ,此时我将计数器存储在Vector中.
let n: usize = 10;
let mut iter_chain: Box<dyn std::iter::Iterator<Item = usize>> = Box::new(1..=n);
let mut filter_overview = vec![0; n];
for i in 2..n {
// cannot borrow `filter_overview` as mutable more than once at a time
// |
// V
iter_chain = Box::new(iter_chain.inspect(|_| filter_overview[i] += 1));
iter_chain = Box::new(iter_chain.filter(move |j| j % i != 0));
}
println!("{filter_overview:?} {}", iter_chain.count());
本例中filter_overview
的预期值为[10, 5, 3, 3, 2, 2, 1, 1]
.
是否有解决此问题的方法,或者我是否必须使用不同于向量的其他方法来存储这些计数器? 也许有一种完全不同的方式来实现这一点?