我将以下代码从 转换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()
}
Run Code Online (Sandbox Code Playgroud)
我能够将其简化为这样,但发现第一个示例更好,因为它没有任何.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()
}
Run Code Online (Sandbox Code Playgroud)
您可以使用以下方法使其变得更短transpose:
fn clean<T, E>(data: Vec<Result<Option<T>, E>>) -> Result<Vec<T>, E> {
data.into_iter().filter_map(|i| i.transpose()).collect()
}
Run Code Online (Sandbox Code Playgroud)
或者也许您会认为无点版本更干净:
fn clean<T, E>(data: Vec<Result<Option<T>, E>>) -> Result<Vec<T>, E> {
data.into_iter().filter_map(Result::transpose).collect()
}
Run Code Online (Sandbox Code Playgroud)