【问题标题】:cannot move out of `*handle` which is behind a shared reference move occurs because `*handle` has type由于 `*handle` 具有类型,因此无法移出共享引用移动背后的 `*handle`
【发布时间】:2020-09-05 16:33:14
【问题描述】:

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

【问题讨论】:

  • iter() 替换为into_iter()

标签: rust


【解决方案1】:

正如评论中所述,解决方案是使用into_iter 而不是iter。原因如下:

当您调用.iter() 方法时,您可以遍历handles 的内容并获得对向量的共享引用(这意味着,如果handlesVec&lt;T&gt; 类型,则闭包中的参数类型为&amp;T)。因此,您不能修改向量的内容。

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

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

【讨论】:

    猜你喜欢
    • 2020-07-21
    • 1970-01-01
    • 1970-01-01
    • 2015-11-27
    • 1970-01-01
    • 2015-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多