如何将 Vec<Result<T, E>> 转换为 Result<Vec<T>, E>?
How do I convert a Vec<Result<T, E>> to Result<Vec<T>, E>?
有什么自以为是且更优雅的方法可以将 Vec<Result<T, E>>
转换为 Result<Vec<T>, E>
吗?我想得到 Ok<Vec<T>>
如果向量的所有值都是 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()
直接编辑成 Result<Vec<T>, E>
;也就是说,您的整个功能可以替换为:
let new: Result<Vec<T>, E> = v.into_iter().collect()
您可以在目标类型上使用 FromIterator
trait implementation on Result
(.collect()
要求 FromIterator
并调用它以从 Iterator
进行转换):
fn vec_of_result_to_result_of_vec<T, E>(v: Vec<Result<T, E>>) -> Result<Vec<T>, E> {
v.into_iter().collect()
}
有什么自以为是且更优雅的方法可以将 Vec<Result<T, E>>
转换为 Result<Vec<T>, E>
吗?我想得到 Ok<Vec<T>>
如果向量的所有值都是 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()
直接编辑成 Result<Vec<T>, E>
;也就是说,您的整个功能可以替换为:
let new: Result<Vec<T>, E> = v.into_iter().collect()
您可以在目标类型上使用 FromIterator
trait implementation on Result
(.collect()
要求 FromIterator
并调用它以从 Iterator
进行转换):
fn vec_of_result_to_result_of_vec<T, E>(v: Vec<Result<T, E>>) -> Result<Vec<T>, E> {
v.into_iter().collect()
}