Rust 和 vec 迭代器 - 如何过滤

Tam*_*mpa 2 rust

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

fn example(data: Vec<f64>, missing_value: f64) {
    let dude = data
        .iter()
        .filter(|&x| *x != missing_value)
        .collect::<Vec<f64>>();
}
Run Code Online (Sandbox Code Playgroud)
fn example(data: Vec<f64>, missing_value: f64) {
    let dude = data
        .iter()
        .filter(|&x| *x != missing_value)
        .collect::<Vec<f64>>();
}
Run Code Online (Sandbox Code Playgroud)

Cai*_*aio 10

for仅有一个实现FromIteratorVec,并且该实现收集T来自同一类型的值T,即不可能转换T为任意类型U并同时收集其元素。

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

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

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

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

  • 如果您可以使用“Vec”,则应该使用“retain”而不是“into_iter”+“filter”+“collect”。了解您的标准库! (2认同)