小编Ben*_*Ben的帖子

将 Vec<Result<Option<T>, E>> 转换为 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()
}
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)

iterator rust

1
推荐指数
1
解决办法
61
查看次数

标签 统计

iterator ×1

rust ×1