Rust 如何将Arc克隆传递给闭包?

Rust 如何将Arc克隆传递给闭包?,rust,closures,lifetime,borrow-checker,trait-objects,Rust,Closures,Lifetime,Borrow Checker,Trait Objects,我试图通过克隆来编写一个使用Arc的闭包。理想情况下,我希望将克隆放在闭包中,但我不得不通过原始的Arc,这可能是我出错的原因: use std::sync::Arc; use std::sync::Condvar; use std::sync::Mutex; use std::collections::VecDeque; type Fifo<T> = Arc<(Mutex<VecDeque<T>>, Condvar)>; fn executo

我试图通过克隆来编写一个使用
Arc
的闭包。理想情况下,我希望将克隆放在闭包中,但我不得不通过原始的
Arc
,这可能是我出错的原因:

use std::sync::Arc;
use std::sync::Condvar;
use std::sync::Mutex;
use std::collections::VecDeque;

type Fifo<T> = Arc<(Mutex<VecDeque<T>>, Condvar)>;

fn executor(f: Box<dyn Fn()>) {
    f();
}

fn main() {
    let a = Fifo::<u8>::new(
        (Mutex::new(VecDeque::new()), Condvar::new())
    );
    
    let r = Box::new(||{
        let f = a.clone();
        f.0.lock().unwrap().push_back(0);
    });
    executor(r);
}
我想改成

let r = Box::new(||{
    //let f = a.clone();
    a.0.lock().unwrap().push_back(0);
});
将强制闭包决定克隆
a
,因此解决了问题,但我得到了相同的错误


如何将
传递给闭包?

在闭包外部克隆
,然后
将克隆移动到闭包中。例如:

使用std::collections::VecDeque;
使用std::sync::Arc;
使用std::sync::Condvar;
使用std::sync::Mutex;
Fifo类型=Arc;
fn执行器(f:Box){
f();
}
fn main(){
设a=Fifo::::new((Mutex::new(VecDeque::new()),Condvar::new());
设f=a.clone();
让r=Box::新建(移动| |{
f、 0.锁定().展开().推回(0);
});
遗嘱执行人(r);
}

弧克隆到封口外部,然后
将克隆移动到封口中。例如:

使用std::collections::VecDeque;
使用std::sync::Arc;
使用std::sync::Condvar;
使用std::sync::Mutex;
Fifo类型=Arc;
fn执行器(f:Box){
f();
}
fn main(){
设a=Fifo::::new((Mutex::new(VecDeque::new()),Condvar::new());
设f=a.clone();
让r=Box::新建(移动| |{
f、 0.锁定().展开().推回(0);
});
遗嘱执行人(r);
}

克隆闭包外的弧,并使用
移动
闭包强制移动:
让r={let a=a.Clone();Box::new(移动|{a.0.lock().unwrap().push_back(0)})还注意到,RIST决不会自动克隆值,这与C++是不同的。闭包可以自动决定是通过移动还是引用进行捕获,因为您不使用捕获的值,所以它决定使用引用,我们必须使用
move
关键字覆盖引用。克隆闭包外部的弧,并使用
move
闭包强制移动:
let r={let A=A.Clone();Box::new(移动|{a.0.lock().unwrap().push|u back(0);})另外,C++还没有决定自动克隆值,而C++则可以自动决定是否通过移动或引用来捕获,并且由于不消耗捕获值,所以它决定了引用,我们必须用<代码>移动< /COD>关键字覆盖。
let r = Box::new(||{
    //let f = a.clone();
    a.0.lock().unwrap().push_back(0);
});