无法将内部价值移出弧锈

ANi*_*120 6 rust

我正在尝试检索FLTK-RS Widget周围的 Arc Mutex 包装器的内部值:

pub struct ArcWidget<T: Clone + WidgetExt + WidgetBase>(Arc<Mutex<T>>);


impl<T: Clone + WidgetExt + WidgetBase> ArcWidget<T>{    
    pub fn widg(&self)->T{
        let lock = self.0.clone();
        let lock2 = lock.into_inner().unwrap();
        lock2
    }
    pub fn redraw(&self){
        let mut widg = self.0.lock().unwrap();
        widg.redraw();
    }
}
Run Code Online (Sandbox Code Playgroud)

然而这会导致错误:

let lock = self.0.into_inner().unwrap().clone(); 
cannot move out of an `Arc` - move occurs because value has type `Mutex<T>`, which does not implement the `Copy` trait
Run Code Online (Sandbox Code Playgroud)

我认为添加Clone特征限制可以解决这个问题,但显然没有。我该如何解决这个错误?WidgetExt+WidgetBase与 不兼容Copy,所以我无法添加Copy特征限制。

log*_*yth 2

为了pub fn widg(&self) -> T {工作,有必要对该T值进行完整克隆。考虑到你的问题的所有界限,它看起来像这样:

pub fn widg(&self) -> T {
    self.0.lock().unwrap().clone()
}
Run Code Online (Sandbox Code Playgroud)

但这不太可能是您真正想要的。看来您真正想要的是这样的:

pub fn widg(&self) -> &Mutex<T> {
    &self.0
}
Run Code Online (Sandbox Code Playgroud)

因为这样任何地方的代码都可以做

let mut widg = self.widg().lock().unwrap();
widg.redraw();
Run Code Online (Sandbox Code Playgroud)

或调用内部小部件上的任何其他方法。