一次迭代多个变量是有用的,可以重叠(slice::windows),也可以不重叠(slice::chunks).

这只适用于切片;为了方便起见,可以对迭代器使用元组吗?

可以这样写:

for (prev, next) in some_iter.windows(2) {
    ...
}

如果不是,它能在现有迭代器上实现为特征吗?

推荐答案

由于Rust 1.51,这在const generics中是可能的,迭代器为任何N生成恒定大小的数组100.

我造了一个小itermore crate 来做这个.它为任何迭代器提供了.chunks().windows()个方法.

for [a, b, c] in some_iter.chunks() {
    ...
}
for [prev, next] in some_iter.windows() {
    ...
}

使用Itertools答案中给出的示例:

use itermore::IterMore;

fn main() {
    let some_iter = vec![1, 2, 3, 4, 5, 6].into_iter();

    for [prev, next] in some_iter.chunks() {
        println!("{}--{}", prev, next);
    }
}

这个输出

1--2
3--4
5--6

大多数情况下,可以推断数组大小,但也可以显式指定它.此外,任何合理的尺寸N都可以使用,没有像Itertools这样的限制.

use itermore::IterMore;

fn main() {
    let mut iter = vec![1, 2, 3, 4, 5, 6].into_iter().windows::<5>();
    println!("{:?}", iter.next());
    println!("{:?}", iter.next());
    println!("{:?}", iter.next());
}

这个输出

Some([1, 2, 3, 4, 5])
Some([2, 3, 4, 5, 6])
None

注意:.windows()使用clone多次生成元素,因此它最好用于引用,复制类型也很便宜.

Rust相关问答推荐

基于对vec值的引用从该值中删除该值

如何在Rust中获得不可辩驳的'if let'模式警告Mutex锁定?""

在HashMap中插入Vacant条目的可变借位问题

如何从铁 rust 中呼唤_mm_256_mul_ph?

文档示例需要导入相关的 struct ,但仅在运行测试时.这是故意的行为吗?

铁 rust 干线无法使用PowerShell获取环境变量

使用模块中的所有模块,但不包括特定模块

如何在不调用Collect()的情况下为新型vec实现IntoIterator?

完全匹配包含大小写的整数范围(&Q;)

不能在Rust中使用OpenGL绘制三角形

在 Rust 中,为什么 10 个字符的字符串的 size_of_val() 返回 24 个字节?

unwrap 选项类型出现错误:无法移出共享引用后面的*foo

类型判断模式匹配panic

Rust 中的方法调用有什么区别?

在构建器模式中捕获 &str 时如何使用生命周期?

为什么允许重新分配 String 而不是 *&String

Rust,我如何正确释放堆分配的内存?

如何在没有 `make_contiguous()` 的情况下对 VecDeque 进行排序或反转?

如何在不设置精度的情况下打印浮点数时保持尾随零?

在 Rust 中组合特征的不同方法是否等效?