【发布时间】: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。有没有更好的写法?
【问题讨论】:
我有一个Vec<Result<T, E>>,我想忽略所有Err 值,将其转换为Vec<T>。我可以这样做:
vec.into_iter().filter(|e| e.is_ok()).map(|e| e.unwrap()).collect()
这是安全的,但我想避免使用unwrap。有没有更好的写法?
【问题讨论】:
我想忽略所有
Err值
由于Result implements IntoIterator,您可以将您的Vec 转换为迭代器(这将是迭代器的迭代器),然后将其展平:
vec.into_iter().flatten().collect()
vec.into_iter().flat_map(|e| e).collect()
这些方法也适用于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 转换由Result 的ok() 方法返回的选项(如果它们是Ok(T)),如果它是Err,则跳过迭代器的该项?非常感谢。