rust - 由于 `*handle` 具有类型,因此无法移出共享引用移动背后的 `*handle`
问题描述
我想用来foreach
等待线程终止。但是,出现以下错误,并没有实现。请告诉我。
cannot move out of `*handle` which is behind a shared reference move occurs because `*handle` has type `std::thread::JoinHandle<()>`, which does not implement the `Copy` trait
let mut handles = Vec::new();
handles.push(thread::spawn(move || {
let mut data = snd_rx.recv().unwrap();
data += 1;
let _ = rcv_tx.send(data);
}));
handles.iter().for_each(|handle| {
let _ = handle.join(); // <- Error occurred
});
解决方案
正如评论中已经说明的那样,解决方案是使用into_iter
而不是iter
. 原因如下:
当您调用该.iter()
方法时,您可以遍历内容handles
并获取对向量的共享引用(这意味着,如果handles
是 type Vec<T>
,则闭包中的参数是 type &T
)。因此,您不能修改向量的内容。
但这正是您在分配handle
给时所做的事情_
(它只是立即删除分配的值),因为此分配将值从向量中移出到局部变量中。错误消息是说,如果JoinHandle
要实现的话,那没关系Copy
(例如,像整数一样,这些值不会移动,而是在赋值时复制),但事实并非如此。
与此相反,当调用 时into_iter
,你会得到一个迭代器,它消耗向量(向量移动到迭代器中,然后在迭代它时消耗它)。在每次迭代中,您都会获得向量的一个元素,但您也拥有该值的所有权,这没关系,因为向量在迭代后无效。由于您现在拥有 的所有权handle
,因此您可以将其移入_
并删除该值。
推荐阅读
- angular - 根据内部值隐藏组件
- reactjs - 如何处理具有多种状态和动作类型的化简器和上下文
- cmd - windows cmd/Powershell如何在没有密码提示的情况下从私钥pfx文件中导出公钥?
- javascript - Safari 变换:scale(),由 JS 添加时图像质量不佳
- python - Python 正在尝试从不同版本的 Python 导入模块。在 PYTHONPATH 中重新排列 Python 版本可以修复它。如何使其永久化?
- angular - 尽管传递了数据,但 Angular 材质对话框在关闭后返回未定义
- ruby - Ruby 是否为 OR / || 计算两个表达式?在使用它进行循环控制时?
- r - R-如何使用多个变量/列将 Long 重塑为 Wide
- ios - UIView 动画发生的速度比给定的持续时间快
- java - 日志文件的自动对话