繁体   English   中英

转换 Vec 的更短方法<result<option<t> , E>> 到结果<vec<t> , E> </vec<t></result<option<t>

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM