我有下面的代码从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()
}
1条答案
按热度按时间rn0zuynd1#
你可以通过使用
transpose
来缩短它:或者,您可以考虑使用无点版本的清洁器: