rust - 除了在每次关闭之前克隆它之外,还有其他选择可以在多个关闭中共享 Arc 吗?

标签 rust closures

我有这样的东西:

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

我明白我为什么会这样:clonearc 传递给闭包之前没有被调用。我可以通过在函数中定义每个闭包并在将其传递给闭包之前克隆 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/

相关文章:

reference - 为什么我可以返回对局部文字的引用而不是变量?

webpack - rust/Wasm : Module not found: Error: Can't resolve 'env' in

windows - libc crate 在 Windows 上不提供 sprintf

javascript - 如何使用闭包访问 Twitter @Anywhere javascript api?

matlab - 如何在Matlab中像在python和js中一样创建 'closure function'?

javascript - JavaScript中两个具有相同名称的函数-如何工作?

sqlite - SQLite用户定义函数可以接受行参数吗?

groovy - 在 Groovy 闭包中模拟 "continue"的最佳模式

javascript - JavaScript 中何时以及如何调用此函数?

rust - 无法声明模块 "cannot declare a new module at this location"