rust - 如何转换 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())
看起来没用的子句。换句话说,代码做了很多事情只是为了让编译器满意。我觉得这是一种常见的情况,有更好的方法来做到这一点。
解决方案
一个迭代器Result<T, E>
可以直接collect()
-ed 到一个Result<Vec<T>, E>
; 也就是说,您的整个功能可以替换为:
let new: Result<Vec<T>, E> = v.into_iter().collect()
推荐阅读
- flutter - Firestore 中等效的 SQL IN 运算符
- django - 未创建类表(未在管理员中看到)
- ios - 从 Xcode 项目构建两个输出
- javascript - 将选择推送到另一个阵列进行存储
- android - 如何在 Android Studio 中制作自定义通知声音?
- rust - 无法打印 process::Command 因为“借来的值不够长”
- c# - 使用PC通过Android设备拨打电话时的C#问题
- c# - 使用 AcquirePointer 时处理 SafeMemoryMappedViewHandle 的正确方法是什么?
- javascript - 为什么通过脚本加载器加载时 Vue 不初始化?
- laravel - Auth::check() 在 Laravel 5.7 的中间件中总是错误的