一次迭代多个变量是有用的,可以重叠(slice::windows
),也可以不重叠(slice::chunks
).
这只适用于切片;为了方便起见,可以对迭代器使用元组吗?
可以这样写:
for (prev, next) in some_iter.windows(2) {
...
}
如果不是,它能在现有迭代器上实现为特征吗?
一次迭代多个变量是有用的,可以重叠(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多次生成元素,因此它最好用于引用,复制类型也很便宜.