banner
davirain

davirain

twitter
github
知乎
twitter

将 Vec<Result<T>, E> 转换为 Result<Vec<T>, E>

要将 Vec<Result<T, E>> 转换为 Result<Vec, E>,可以使用 Iterator trait 中的 try_fold () 方法。下面是一个示例实现:

在这里,我们使用 into_iter () 将 Vec 转换为迭代器。然后调用 try_fold (),传入一个初始值 Vec::new () 和一个闭包,该闭包接受两个参数:一个累加器(acc)和一个 Result(res)。

fn vec_result_to_result_vec<T, E>(v: Vec<Result<T, E>>) -> Result<Vec<T>, E> {
    v.into_iter().try_fold(Vec::new(), |mut acc, res| {
        match res {
            Ok(t) => {
                acc.push(t);
                Ok(acc)
            },
            Err(e) => Err(e)
        }
    })
}

闭包模式匹配 Result 变体,将 Ok 值推入 acc 向量并返回 Ok (acc),如果 Result 是 Err,则返回 Err (e)。try_fold () 方法将继续迭代迭代器中的剩余项,并将更新后的累加器值传递给每个后续调用闭包的调用。

如果原始 Vec 中的任何 Result 是 Err,try_fold () 将中断并返回遇到的第一个 Err。否则,它将返回带有解包的 T 值的 Vec 的 Ok (acc)。

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。