1

假设我有一个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的参考?我写了我能想到的唯一方法,但对于我看来微不足道的事情,它看起来有点乏味。

4

1 回答 1

2

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

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

您可以filter_map这里了解更多信息。


正如@Masklinn 和这里所提到的,Option实现IntoIterator了你也可以像使用flattenforOption一样使用 for Result

let only_elements = bar.iter().flatten().collect::<Vec<_>>();
于 2021-07-19T00:49:18.480 回答