是否有任何固执且更优雅的方式来转换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)
}
Run Code Online (Sandbox Code Playgroud)
我正在寻找一种更具声明性的方式来写这个。这个功能迫使我写一个where永远不会被使用并且Err(el.unwrap_err())看起来毫无用处的子句。换句话说,代码做了很多事情只是为了让编译器满意。我觉得这是一个很常见的情况,有更好的方法来做到这一点。
Joh*_*ter 11
一个迭代器Result<T, E>可以直接collect()-ed 到一个Result<Vec<T>, E>; 也就是说,您的整个函数可以替换为:
let new: Result<Vec<T>, E> = v.into_iter().collect()
Run Code Online (Sandbox Code Playgroud)
您可以在(需要目标类型并调用它以进行转换)上使用FromIterator特征实现:Result.collect()FromIteratorIterator
fn vec_of_result_to_result_of_vec<T, E>(v: Vec<Result<T, E>>) -> Result<Vec<T>, E> {
v.into_iter().collect()
}
Run Code Online (Sandbox Code Playgroud)