我试图一次映射一个迭代器的项目。像这样:
let a = vec![1, 2, 3, 4];
let b = a.iter().map2(|i, j| i + j);
然后 b.collect()
会产生b = [3, 7]
有没有一种简单的方法可以达到这个目的?
答案 0 :(得分:3)
没有说明。你需要把它分解为“拆分vec到不相交子集的迭代器”和“求和每个子集”:
let a = vec![1, 2, 3, 4];
let b = a.chunks(2).map(|chunk| chunk.iter().sum::<i32>());
println!("b = {:?}", b.collect::<Vec<_>>());
请注意,当a
是一般迭代器(它依赖于它作为切片)时,这不起作用,尽管您可以使用itertools
包来使其工作:
use itertools::Itertools;
let a = vec![1, 2, 3, 4];
let a = a.iter().cloned(); // we can't rely on a being a Vec any more.
let b = (&a.chunks(2)).into_iter()
.map(|chunk| chunk.sum::<i32>())
.collect::<Vec<_>>();
println!("b = {:?}", b);