rust 将Vec〈结果〈选项< T>,E>>转换为结果〈Vec< T>,E>的较短方法

bqf10yzr  于 2023-01-02  发布在  其他
关注(0)|答案(1)|浏览(195)

我有下面的代码从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()
}
rn0zuynd

rn0zuynd1#

你可以通过使用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()
}

相关问题