我有一个向量,并尝试通过过滤创建一个新的向量。它不起作用,我也不知道为什么:
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>`
答案 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>>();