我正在尝试检索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特征限制。
为了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)
或调用内部小部件上的任何其他方法。
| 归档时间: |
|
| 查看次数: |
2787 次 |
| 最近记录: |