无法移动位于共享引用之后的`*handle`,因为`*handle`的类型是

3
我想使用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
});


2
into_iter() 替换 iter() - user4815162342
1个回答

7
如先前在评论中所述,解决方案是使用into_iter而不是iter。原因如下:
当调用.iter()方法时,您可以迭代访问handles的内容,并获得指向向量的共享引用(也就是说,如果handles的类型为Vec<T>,则闭包参数的类型为&T)。因此,您无法修改向量的内容。
但是,当将handle分配给_(这只是立即丢弃已分配值的操作)时,您正在做出的正是这一点,因为此赋值会将该值从向量移动到局部变量中。错误消息显示,如果JoinHandle实现了Copy(例如整数这样的值就不是移动而是复制),那么这样做是可以的,但它没有实现Copy
与此相反,当调用into_iter时,您将获取一个消耗向量的迭代器(向量移动到迭代器中,在迭代过程中被消耗)。在每次迭代中,您将得到一个向量元素,并接管该值的所有权,这是可以的,因为在迭代后向量将无效。由于现在您拥有handle的所有权,因此可以将其移动到_中并将其丢弃。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接