> 到结果, E>?,rust,monads"/>

首页 > 解决方案 > 如何转换 Vec> 到结果, E>?

问题描述

是否有任何自以为是且更优雅的方式转换Vec<Result<T, E>>Result<Vec<T>, E>?我想知道Ok<Vec<T>>vector 的所有值是否都是Ok<T>Err<E>如果至少有一个是Err<E>.

例子:

fn vec_of_result_to_result_of_vec<T, E>(v: Vec<Result<T, E>>) -> Result<Vec<T>, E>
where
    T: std::fmt::Debug,
    E: std::fmt::Debug,
{
    let mut new: Vec<T> = Vec::new();

    for el in v.into_iter() {
        if el.is_ok() {
            new.push(el.unwrap());
        } else {
            return Err(el.unwrap_err());
        }
    }

    Ok(new)
}

我正在寻找一种更具声明性的方式来写这个。这个函数迫使我写一个where永远不会使用并且Err(el.unwrap_err())看起来没用的子句。换句话说,代码做了很多事情只是为了让编译器满意。我觉得这是一种常见的情况,有更好的方法来做到这一点。

标签: rustmonads

解决方案


一个迭代器Result<T, E>可以直接collect()-ed 到一个Result<Vec<T>, E>; 也就是说,您的整个功能可以替换为:

let new: Result<Vec<T>, E> = v.into_iter().collect()

推荐阅读