仅从选项向量中获取“Some”内部的惯用方法?

Idiomatic way to only get insides of `Some` from a vector of options?

我正在学习 Rust 并试图习惯使用 Results 和 Options。给定一个向量。如果我只想要没有错误的结果(或者 none 对于 Option),是否有比下面更优雅的方式来做这件事,或者这是我想要的样板数量平时都要写吗?

我意识到在 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>>();

您可以使用 filter_map 它只能 returns Somes 而不是 Nones。

let optvec   = vec![Some(1), None, Some(4), None];
let filtered: Vec<i32> = optvec.iter().filter_map(|f| *f).collect();
println!("{:?}", filtered);
>>> [1, 4]

在你的情况下,因为你没有做任何映射,我建议使用 flattening 而不是 filter_maping。 在我看来,这更清楚,更容易解释。

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