在滤除Rust中的None元素后,是否可以通过某种方式将Vec <option <value >>转换为Vec <value>?

时间:2019-02-04 19:21:41

标签: functional-programming rust iterator

在编写这样的代码时,我想要某种方式进行这种转换:

struct Value;

fn remove_missed(uncertain_vector: Vec<Option<Value>>) -> Vec<Value> {
    uncertain_vector
        .into_iter()
        .filter(|element| match element {
            Some(val) => true,
            None => false,
        })
        .collect()
}

我该如何实现?我认为类型隐含机制不够聪明,无法确定结果集合仅包含Option<Value>,其中所有此类对象的类型(Value)都相同。

编译器部分回答了我的问题:

error[E0277]: a collection of type `std::vec::Vec<Value>` cannot be built from an iterator over elements of type `std::option::Option<Value>`
  --> src/lib.rs:10:10
   |
10 |         .collect()
   |          ^^^^^^^ a collection of type `std::vec::Vec<Value>` cannot be built from `std::iter::Iterator<Item=std::option::Option<Value>>`
   |
   = help: the trait `std::iter::FromIterator<std::option::Option<Value>>` is not implemented for `std::vec::Vec<Value>`

1 个答案:

答案 0 :(得分:3)

您可以使用Iterator::filter_map一次性过滤和映射元素。

let v = vec![None, None, Some(1), Some(2), None, Some(3)];
let filtered: Vec<_> = v.into_iter().filter_map(|e| e).collect();

Playground