gpt4 book ai didi

rust - 无法移出位于共享引用移动后面的 `*handle`,因为 `*handle` 具有类型

转载 作者:行者123 更新时间:2023-12-03 11:37:00 36 4
gpt4 key购买 nike

我想使用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 的内容并获得对向量的共享引用(这意味着,如果 handlesVec<T> 类型,则闭包中的参数是 &T 类型)。因此,您不能修改向量的内容。

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

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

关于rust - 无法移出位于共享引用移动后面的 `*handle`,因为 `*handle` 具有类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63756181/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com