我有这样的东西:
use std::sync::Arc;
fn main() {
let arc = Arc::new(42);
move || { arc.clone() };
move || { arc.clone() };
}
我得到:
error[E0382]: capture of moved value: `arc`
--> src/main.rs:6:19
|
5 | move || { arc.clone() };
| ------- value moved (into closure) here
6 | move || { arc.clone() };
| ^^^ value captured here after move
|
= note: move occurs because `arc` has type `std::sync::Arc<i32>`, which does not implement the `Copy` trait
我明白我为什么会这样:clone
在 arc
传递给闭包之前没有被调用。我可以通过在函数中定义每个闭包并在将其传递给闭包之前克隆 Arc
来解决此问题,但是还有其他选择吗?
最佳答案
没有办法绕过它。在闭包中使用之前,您应该克隆 Arc
。常见的模式是将克隆的 Arc
重新绑定(bind)到嵌套范围中的相同名称:
use std::sync::Arc;
fn main() {
let arc = Arc::new(42);
{
let arc = arc.clone();
move || { /* do something with arc */ };
}
{
let arc = arc.clone();
move || { /* do something else with arc */ };
}
}
这通常与 thread::spawn()
一起完成:
use std::sync::{Arc, Mutex};
use std::thread;
const NUM_THREADS: usize = 4;
fn main() {
let arc = Arc::new(Mutex::new(42));
for _ in 0..NUM_THREADS {
let arc = arc.clone();
thread::spawn(move || {
let mut shared_data = arc.lock().unwrap();
*shared_data += 1;
});
}
}
关于rust - 除了在每次关闭之前克隆它之外,还有其他选择可以在多个关闭中共享 Arc 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60177688/