假设我有一个 IntoIter,我想从右到左收集 n 个元素的块(相当于切片上的 rchunk)。我可以在迭代器上
.rev()
,然后为我想要收集的每个块调用 .by_ref().take(n).rev()
。
let mut iter = vec![vec![0], vec![1], vec![2], vec![3]]
.into_iter()
.rev();
let vec1: Vec<_> = iter.by_ref().take(2).rev().collect();
println!("{:?}", vec1);
let vec2: Vec<_> = iter.by_ref().take(2).rev().collect();
println!("{:?}", vec2);
这适用于
vec1
,但 vec2
将为空。
我期望
vec2
是 [[0], [1]] 而不是空的。看起来 .rev()
方法不仅更改了 Take 迭代器,还更改了原始迭代器。它消耗了原始迭代器还是发生了什么?
您和许多其他人一样,误解了
take
、rev
和其他迭代器适配器的工作原理。他们不直接采取/反转/...,而是修改底层迭代器,使其表现得好像它只有 2 长/从另一端迭代/...因此 .rev() … .rev()
ed 迭代器从左侧迭代,因此 .rev().take(n).rev()
的适配器链会遍历 所有 元素并仅保留最后一个 n
。