有没有一种方法可以从本身采用 &mut self 的方法中传递 &mut self?
Is there a way to pass &mut self from a method that itself takes &mut self?
我得到了包含 Box<dyn Runmode>
的结构 State
。运行模式应该能够切换,当它切换时,旧的运行模式被卸载(它释放它的资源并重置一些状态),然后重新分配包含运行模式的框,并加载新的运行模式。加载运行模式时,它必须能够访问 State
结构以修改 and/or 读取一些对运行模式正常工作必不可少的内容,并且在卸载时它必须能够重置该状态。这是我的代码:
trait Runmode {
fn load(&mut self, state: &mut State);
...
fn unload(&mut self, state: &mut State);
}
struct State {
runmode: Box<dyn Runmode>,
...
}
impl State {
pub fn set_runmode(&mut self, mut new_runmode: Box<dyn Runmode>) {
self.runmode.unload(self);
// the line above causes errors
self.runmode = new_runmode;
self.runmode.load(self);
// this line also causes errors
}
}
如您所知,这会导致对单个对象的多个可变引用的问题,这是不允许的。但我真的没有看到解决这个问题的另一种方法。地狱,即使这样也无法编译:
fn switch_runmode(mut state: State, mut new_runmode: Box<dyn Runmode>) {
state.runmode.unload(&mut state);
state.runmode = new_runmode;
state.runmode.load(&mut state);
}
我在这里忘记了什么?在第二个示例中,它还说我借用了两次可变对象,但我唯一一次在加载和卸载运行模式时进行了可变借用,然后只有一个可变引用,即进入运行模式方法的引用。
假设 load
和 unload
不修改 state.runmode
,您可以将 State
拆分为两部分:runmode
和 nonrunmode
:
struct State {
runmode: Box<dyn Runmode>,
nonrunmode: NonRunMode, // contains everything else
}
然后,unload
和load
可以将&mut NonRunMode
作为参数。
trait Runmode {
fn load(&mut self, state: &mut NonRunMode);
...
fn unload(&mut self, state: &mut NonRunMode);
}
这应该让编译器清楚地知道只有 State
的不同部分被修改了。
我得到了包含 Box<dyn Runmode>
的结构 State
。运行模式应该能够切换,当它切换时,旧的运行模式被卸载(它释放它的资源并重置一些状态),然后重新分配包含运行模式的框,并加载新的运行模式。加载运行模式时,它必须能够访问 State
结构以修改 and/or 读取一些对运行模式正常工作必不可少的内容,并且在卸载时它必须能够重置该状态。这是我的代码:
trait Runmode {
fn load(&mut self, state: &mut State);
...
fn unload(&mut self, state: &mut State);
}
struct State {
runmode: Box<dyn Runmode>,
...
}
impl State {
pub fn set_runmode(&mut self, mut new_runmode: Box<dyn Runmode>) {
self.runmode.unload(self);
// the line above causes errors
self.runmode = new_runmode;
self.runmode.load(self);
// this line also causes errors
}
}
如您所知,这会导致对单个对象的多个可变引用的问题,这是不允许的。但我真的没有看到解决这个问题的另一种方法。地狱,即使这样也无法编译:
fn switch_runmode(mut state: State, mut new_runmode: Box<dyn Runmode>) {
state.runmode.unload(&mut state);
state.runmode = new_runmode;
state.runmode.load(&mut state);
}
我在这里忘记了什么?在第二个示例中,它还说我借用了两次可变对象,但我唯一一次在加载和卸载运行模式时进行了可变借用,然后只有一个可变引用,即进入运行模式方法的引用。
假设 load
和 unload
不修改 state.runmode
,您可以将 State
拆分为两部分:runmode
和 nonrunmode
:
struct State {
runmode: Box<dyn Runmode>,
nonrunmode: NonRunMode, // contains everything else
}
然后,unload
和load
可以将&mut NonRunMode
作为参数。
trait Runmode {
fn load(&mut self, state: &mut NonRunMode);
...
fn unload(&mut self, state: &mut NonRunMode);
}
这应该让编译器清楚地知道只有 State
的不同部分被修改了。