我正在使用Rayon迭代一个向量,产生Vec
个结果:
let coordinates = &[[38.5, -120.2], [40.7, -120.95], [430.252, -126.453]]
let mut res = vec![];
coordinates
.par_iter()
.map(|pair| {
match (check(&pair[0]), check(&pair[1])) {
(Ok(v1), Ok(v2)) => Ok([v1, v2]),
(Err(v), _) => Err(v),
(_, Err(v)) => Err(v),
}
})
.collect_into(&mut res);
我想检查res
是否有任何错误值,将其转换为String
并使用try!()
这很有效,但考虑到我正在分配一个新的向量来汇总我的结果或者出错:
let errcheck: Result<Vec<_>, f64> = res.iter().map(|elem| *elem).collect();
try!(errcheck.map_err(|e| format!("Error: {}", e).to_string()));
这个问题似乎是人造丝特有的;如果我使用.iter()
,我可以使用匹配部门中的errcheck
和collect()
直接收集到map_err()
,我似乎无法使用par_iter()
。
有更好的方法吗?
答案 0 :(得分:3)
如果您只需要不符合特定条件的物品,
有filter()
:
let bounds1 = (-90.0, 90.0);
let bounds2 = (-180.0, 180.0);
let (xmin, xmax) = bounds1;
let (ymin, ymax) = bounds2;
coordinates.par_iter().filter(|pair| {
let x = pair[0];
let y = pair[1];
!((xmin <= x) && (x <= xmax) && (ymin <= y) && (y <= ymax))
}).for_each(|pair| {
println!("Bad pair: {} {}", pair[0], pair[1]);
});
换句话说,首先映射正确的操作。