有没有一种方法可以从本身采用 &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);
}

我在这里忘记了什么?在第二个示例中,它还说我借用了两次可变对象,但我唯一一次在加载和卸载运行模式时进行了可变借用,然后只有一个可变引用,即进入运行模式方法的引用。

假设 loadunload 不修改 state.runmode,您可以将 State 拆分为两部分:runmodenonrunmode :

struct State {
    runmode: Box<dyn Runmode>,
    nonrunmode: NonRunMode, // contains everything else
}

然后,unloadload可以将&mut NonRunMode作为参数。

trait Runmode {
    fn load(&mut self, state: &mut NonRunMode);
    ...
    fn unload(&mut self, state: &mut NonRunMode);
}

这应该让编译器清楚地知道只有 State 的不同部分被修改了。