如何从一个选项向量中仅获取“Some”的惯用方式?

3
我正在学习Rust,并尝试适应使用ResultOption。给定一个包含它们的向量,如果我只想要没有出错的结果(或对于Option不是none),是否有比下面更优雅的方法来实现这个目标?或者这就是通常需要编写的样板代码量?
我意识到在map中可以进行更细粒度的操作,例如unwrap_or_elsepartition将好的结果与坏的结果分开。

    let optvec   = vec![Some(1), None, Some(4), None];
    let filtered = optvec.iter()
    .filter(|q| q.is_some())
    .map(|q| q.unwrap())
    .collect::<Vec<i32>>();


2个回答

9
您可以使用filter_map,它仅返回Some而不是None。
let optvec   = vec![Some(1), None, Some(4), None];
let filtered: Vec<i32> = optvec.iter().filter_map(|f| *f).collect();
println!("{:?}", filtered);
>>> [1, 4]

4
你也可以只使用.flatten()方法,因为Option<T>也实现了Iterator<Item=T> - belst

2

在您的情况下,由于您没有进行任何映射,我建议使用flatten而不是filter_map

在我看来,这更清晰、更自说明。

    let optvec = vec![Some(1), None, Some(4), None];
    let filtered: Vec<i32> = optvec.iter().flatten().cloned().collect();
    assert_eq!(filtered, &[1, 4]);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接