当我在 IntoIter 上调用 .by_ref().take().rev() 时会发生什么

问题描述 投票:0回答:1

假设我有一个 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 迭代器,还更改了原始迭代器。它消耗了原始迭代器还是发生了什么?

rust iterator
1个回答
0
投票

您和许多其他人一样,误解了

take
rev
和其他迭代器适配器的工作原理。他们不直接采取/反转/...,而是修改底层迭代器,使其表现得好像它只有 2 长/从另一端迭代/...因此
.rev() … .rev()
ed 迭代器从左侧迭代,因此
.rev().take(n).rev()
的适配器链会遍历 所有 元素并仅保留最后一个
n

© www.soinside.com 2019 - 2024. All rights reserved.