锈和vec迭代器-如何过滤

时间:2019-01-20 05:06:43

标签: rust

我有一个向量,并尝试通过过滤创建一个新的向量。它不起作用,我也不知道为什么:

fn example(data: Vec<f64>, missing_value: f64) {
    let dude = data
        .iter()
        .filter(|&x| *x != missing_value)
        .collect::<Vec<f64>>();
}
error[E0277]: a collection of type `std::vec::Vec<f64>` cannot be built from an iterator over elements of type `&f64`
 --> src/lib.rs:5:10
  |
5 |         .collect::<Vec<f64>>();
  |          ^^^^^^^ a collection of type `std::vec::Vec<f64>` cannot be built from `std::iter::Iterator<Item=&f64>`
  |
  = help: the trait `std::iter::FromIterator<&f64>` is not implemented for `std::vec::Vec<f64>`

1 个答案:

答案 0 :(得分:2)

只有一个implementation of FromIterator for Vec,并且此实现从同一类型T收集T的值,即无法将T转换为任意值输入U并同时收集其元素。

在您的情况下,您希望将&f64的迭代器收集到f64的向量中,因此,您需要通过克隆进行转换然后收集。

self.data.iter().filter(|&&x| x != self.missing_value).cloned().collect::<Vec<f64>>();

如果您拥有矢量的所有权,则可以使用f64来迭代&f64而不是into_iter

self.data.into_iter().filter(|&x| x != self.missing_value).collect::<Vec<f64>>();