rust - 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>`
解决方案
for有一个单独的实现FromIterator
Vec
,这个实现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>>();
推荐阅读
- mysql - Dockerfile 的输出不等于容器内运行的相同命令的输出
- php - 将PDF转换为图像时,PHP Imagick会挂起整个服务器
- css - 如何在 React 中使用样式化组件来获取关键帧动画
- python - 看不到代码行中有什么无效语法
- android - Android 10 中的拖放功能有什么变化吗?
- javascript - 有没有办法将变量添加到 Regex 并在 JavaScript 或 TypeScript 中使用它们?
- javascript - 根据组件重用需要或不需要道具的通用 PropType 形状
- matlab - 用于转换文件夹中文件的Matlab程序没有迭代
- regex - 特定字符的元素之间的正则表达式
- swift - 如何在 CGAffineTransform 上为 SwiftUI 中的旋转角度添加动画?