【问题标题】:Rust iterator something like chunks()Rust 迭代器类似于 chunks()
【发布时间】:2026-02-07 10:10:01
【问题描述】:

这个迭代器

let data = vec![0, 1, 2, 3, 4, 5];

for x in data.chunks(2) {
    println!("{:?}", x);
}

会产生

[0, 1]
[2, 3]
[4, 5]

我可以使用迭代器来获得这样的东西吗?

[0, 1]
[1, 2]
[2, 3]
[3, 4]
[4, 5]

我知道如何使用 for 循环来做到这一点。但是迭代器可以做得更好吗?

【问题讨论】:

标签: rust iterator


【解决方案1】:

我想您可以为此使用Itertools.tuple_windows。根据文档,它“在所有连续窗口上返回一个迭代器,生成特定大小的元组(最多 4 个)”

use itertools::Itertools;
use itertools::TupleWindows;
use std::slice::Iter;

let data = vec![0, 1, 2, 3, 4, 5];

let it: TupleWindows<Iter<'_, i32>, (&i32, &i32)> = data.iter().tuple_windows();

for elem in it {
    println!("{:?}", elem);
}

输出:

(0, 1)
(1, 2)
(2, 3)
(3, 4)
(4, 5)

编辑: 正如@Masklinn 的comment1 和@SebastianRedl 的comment2 中所述,您还可以使用stdlib 中的windows 并避免在您的项目中包含Itertools。但请注意,它仅适用于切片(或强制切片的事物),不适用于通用迭代器(在您的情况下很好)。

let data = vec![0, 1, 2, 3, 4, 5];

let it = data.windows(2);

for elem in it {
    println!("{:?}", elem);
}

输出:

[0, 1]
[1, 2]
[2, 3]
[3, 4]
[4, 5]

【讨论】:

  • FWIW 在 stdlib 中有 windows ,它在切片上进行迭代,在这里可能就足够了。
  • @Masklinn 谢谢,我编辑了答案以包含您的建议。
  • @mgc 您应该在回答中注意windows 仅适用于切片(或强制切片的事物),而不适用于一般迭代器。
【解决方案2】:

或者,无需额外依赖,您可以压缩相同的迭代器,在第二个项目上跳过一项。

fn main() {
    let data = vec![0, 1, 2, 3, 4, 5];
    let i1 = data.iter();
    let i2 = data.iter();
    for (a, b) in i1.zip(i2.skip(1)) {
        println!("{} {}", a, b);
    }
}

Playground

【讨论】: