如何在 Rust 中将选项向量转换为简单向量?

How to convert a vector of options to a simple vector in Rust?

假设我有一个 Vec 包含一个名为 'Dummy'.

的结构的可选框
struct Dummy {
    foo: i32
}

fn main() {
    let a = Box::new(Dummy {foo: 42});
    let b = Box::new(Dummy {foo: 69});
    let c = Box::new(Dummy {foo: 420});

    let bar = vec![Some(a), None, Some(b), None, Some(c)];

    // This works, but it's a lot of calls for a single task.
    let only_elements: Vec<&Box<Dummy>> = bar.iter()
        .filter(|&el| el.is_some())
        .map(|el| el.as_ref().unwrap())
        .collect();

    for el in only_elements {
        println!("{}", el.foo);
    }
}

如何以更漂亮的方式将此 Vec 选项转换为简单的 Vec 引用? 我写了我唯一能想到的方法,但对于一个对我来说微不足道的东西来说,它看起来有点乏味。

您可以使用 filter_map。它至少从您拥有的内容中删除一行。您还可以在 collect::<Vec<_>> 中使用 turbofish 和下划线来指定类型,这样在您想要更改映射时无需显式声明类型。

let only_elements = bar.iter()
        .filter_map(Option::as_ref)
        .collect::<Vec<_>>();

您可以从 here 阅读更多关于 filter_map 的信息。


如@Masklinn 和 所述,Option 实现了 IntoIterator,因此您也可以像对 Option 使用 flatten 作为 Option 20=].

let only_elements = bar.iter().flatten().collect::<Vec<_>>();