[英]Partition over Vec<Result<T, E>> fails due to type mismatch
[英]Shorter way to convert Vec<Result<Option<T>, E>> to Result<Vec<T>, E>
我有以下代码从Vec<Result<Option<T>, E>>
转换为Result<Vec<T>, E>
但我想知道是否有一些我不知道的迭代器可以进一步简化它/使代码更简洁。
fn clean<T, E>(data: Vec<Result<Option<T>, E>>) -> Result<Vec<T>, E> {
data.into_iter()
.filter_map(|i| match i {
Ok(Some(a)) => Some(Ok(a)),
Ok(None) => None,
Err(e) => Some(Err(e)),
})
.collect()
}
我能够将它减少到这个,但发现第一个例子更好,因为它没有任何.unwrap()
:
fn clean<T, E>(data: Vec<Result<Option<T>, E>>) -> Result<Vec<T>, E> {
data.into_iter()
.filter_map(|i| match i {
Ok(None) => None,
_ => Some(i.map(|i| i.unwrap())),
})
.collect()
}
您可以使用transpose
使其更短:
fn clean<T, E>(data: Vec<Result<Option<T>, E>>) -> Result<Vec<T>, E> {
data.into_iter().filter_map(|i| i.transpose()).collect()
}
或者,也许您会考虑更简洁的无点版本:
fn clean<T, E>(data: Vec<Result<Option<T>, E>>) -> Result<Vec<T>, E> {
data.into_iter().filter_map(Result::transpose).collect()
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.