rust - 有没有一种快速的方法来检查 Vec 是否有错误结果?

标签 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()));

这个问题似乎是 Rayon 特有的;如果我使用 .iter() ,我可以直接收进errcheck使用 collect()map_err()在火柴臂中,我似乎无法使用 par_iter() .

有更好的方法吗?

最佳答案

如果您只需要不满足某些条件的项目, 有 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]);
});

换句话说,map首先是正确的操作。

关于rust - 有没有一种快速的方法来检查 Vec 是否有错误结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38330483/

相关文章:

rust - 如何为将作为闭包参数的关联类型指定生存期?

rust - 如何查看 TcpStream 并阻塞直到有足够的字节可用?

rust - 将方法从特征实现移动到特征定义时出现不匹配类型错误

reference - 从作为参数传递给函数的引用返回内部引用时的生命周期处理

json - 如何用 Rust 合并两个 JSON 对象?

initialization - 如何初始化包含引用的结构?

rust - 如何将 std::fmt::Arguments 转换为字符串?

generics - 如何在不使函数泛型的情况下将具有泛型的闭包传递给函数?

arrays - 从大小可变的数组构造一个结构

rust - 为什么将移动值的成员分配给时编译不会失败?