是否有快速检查Vec的错误结果?

时间:2016-07-12 13:35:56

标签: rust

我正在使用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(),我可以使用匹配部门中的errcheckcollect()直接收集到map_err(),我似乎无法使用par_iter()

有更好的方法吗?

1 个答案:

答案 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]);
});

换句话说,首先映射正确的操作。