【发布时间】:2020-06-15 06:33:24
【问题描述】:
我有一种情况,我必须通过&mut self 将结构从一个对象移动到另一个对象。看看:
pub struct MyStruct {
//no copy trait
device: Device
}
impl MyStruct {
pub fn finalize(&mut self) {
//error: cannot move since I borrowed
let interface = InterfaceBuilder::new(self.device)
}
}
首先,为什么我不能从借来的可变引用中移出一些东西?借用的可变数据是独占的,不可能有其他代码在调查它。
好吧,为了解决这个问题,我改为
pub struct MyStruct {
//no copy trait
device: RefCell<Device>
}
impl MyStruct {
pub fn finalize(&mut self) {
//error on `self.device`: cannot move out of `self.device` which is behind a mutable reference
let interface = InterfaceBuilder::new(self.device.into_inner())
}
}
我知道为什么会发生错误:
pub fn into_inner(self) -> T
调用into_inner 使self.device 移动。为什么RefCell 根本没有实现pub fn into_inner(&mut self) -> T?我看不出有什么问题。
【问题讨论】:
-
在您的第一个版本中,不可能有其他代码正在调查它 现在,但原所有者可能会在稍后调查它,在
finalize返回并释放可变借用之后。 -
如果
into_inner没有消费,那么之后RefCell会是什么? -
你的
finalize方法应该拥有self:pub fn finalize (self) { … } -
我的猜测是您无法控制
finalize()的签名(例如,因为它是您无法控制的特征),但您可以控制MyStruct。如果这个猜测是正确的,那么一种解决方案是使用Option<Device>。您可以使用take()方法移出&mut Option<_>,从而将None留在选项中。 -
不管我是否猜对了您的问题,如果您能澄清问题以进一步解释您的要求,那就太好了。展示您解决问题的尝试很重要,但解释您尝试解决的实际问题对于获得有用的答案也很重要。
标签: rust