【问题标题】:How do I avoid unwrap when converting a vector of Options or Results to only the successful values?将选项或结果向量仅转换为成功值时,如何避免展开?
【发布时间】:2025-11-30 10:25:01
【问题描述】:

我有一个Vec<Result<T, E>>,我想忽略所有Err 值,将其转换为Vec<T>。我可以这样做:

vec.into_iter().filter(|e| e.is_ok()).map(|e| e.unwrap()).collect()

这是安全的,但我想避免使用unwrap。有没有更好的写法?

【问题讨论】:

    标签: rust iterator


    【解决方案1】:

    我想忽略所有Err

    由于Result implements IntoIterator,您可以将您的Vec 转换为迭代器(这将是迭代器的迭代器),然后将其展平:

    这些方法也适用于Option,其中also implements IntoIterator


    您也可以将Result 转换为Option 并使用Iterator::filter_map

    vec.into_iter().filter_map(|e| e.ok()).collect()
    

    【讨论】:

    • 哈利路亚!刚刚了解filter_map()。我像这样成功使用它:let mut lines: Vec<String> = reader.lines().filter_map(|l| l.ok() ).collect();。为了确保我理解,filter_map 转换由Resultok() 方法返回的选项(如果它们是Ok(T)),如果它是Err,则跳过迭代器的该项?非常感谢。
    • @PeterCharland 或多或少。但是为什么要使用它而不是答案中显示的较短版本呢?
    • 我想我还是不明白为什么 into_iter 返回一个二维迭代器。
    最近更新 更多