首页 > 解决方案 > 由于 `*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
});

标签: rust

解决方案


正如评论中已经说明的那样,解决方案是使用into_iter而不是iter. 原因如下:

当您调用该.iter()方法时,您可以遍历内容handles并获取对向量的共享引用(这意味着,如果handles是 type Vec<T>,则闭包中的参数是 type &T)。因此,您不能修改向量的内容。

但这正是您在分配handle给时所做的事情_(它只是立即删除分配的值),因为此分配将值从向量中移出到局部变量中。错误消息是说,如果JoinHandle要实现的话,那没关系Copy(例如,像整数一样,这些值不会移动,而是在赋值时复制),但事实并非如此。

与此相反,当调用 时into_iter,你会得到一个迭代器,它消耗向量(向量移动到迭代器中,然后在迭代它时消耗它)。在每次迭代中,您都会获得向量的一个元素,但您也拥有该值的所有权,这没关系,因为向量在迭代后无效。由于您现在拥有 的所有权handle,因此您可以将其移入_并删除该值。


推荐阅读