这个迭代器
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循环来实现,但是迭代器能否做得更好?
这个迭代器
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循环来实现,但是迭代器能否做得更好?
我猜你可以使用 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在评论1和@SebastianRedl在评论2中所指出的,您还可以使用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]
windows
方法可以迭代切片并且可能已经足够使用了。 - Masklinnwindows
仅适用于切片(或可以强制转换为它们的东西),而不是一般的迭代器。 - Sebastian Redl或者,不需要额外的依赖项,您可以将相同的迭代器压缩,然后在第二个迭代器上跳过一个项目。
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);
}
}