有没有更优雅、更有见解的方法将
我希望有一个更加声明式的方式来编写这个函数。该功能强制我编写永远不会被使用的
Vec<Result<T, E>>
转换为 Result<Vec<T>, E>
?如果向量中所有值都是 Ok<T>
,则希望获得 Ok<Vec<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())
看起来毫无意义。换句话说,代码为了让编译器高兴而做了很多事情。我觉得这是一个非常普遍的情况,应该有更好的方法来解决它。
match
代替is_ok()
来避免unwrap()
(和Debug
边界)的出现。但在这种情况下,使用collect()
更加简洁。 - Tavian Barnes