首页 > 解决方案 > rust 和 vec 迭代器 - 如何过滤

问题描述

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

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>`

标签: rust

解决方案


for有一个单独的实现FromIteratorVec,这个实现T从相同的 type收集值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>>();

推荐阅读