Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 有没有办法通过&;mut self来自于一种自身需要的方法&;莫特·赛尔夫?_Rust_Ownership - Fatal编程技术网

Rust 有没有办法通过&;mut self来自于一种自身需要的方法&;莫特·赛尔夫?

Rust 有没有办法通过&;mut self来自于一种自身需要的方法&;莫特·赛尔夫?,rust,ownership,Rust,Ownership,我得到了这个结构状态,它包含一个框。运行模式应该能够被切换,当它被切换时,旧的运行模式被卸载(它释放它的资源并重置一些状态),然后包含运行模式的框被重新分配,新的运行模式被加载。加载运行模式时,它必须能够访问状态结构,以修改和/或读取运行模式正常工作所必需的某些内容,卸载时,它必须能够重置该状态。这是我的密码: trait运行模式{ fn加载(&mut自身,状态:&mut状态); ... fn卸载(&mut self,状态:&mut state); } 结构状态{ 运行模式:Box, ... }

我得到了这个结构
状态
,它包含一个
。运行模式应该能够被切换,当它被切换时,旧的运行模式被卸载(它释放它的资源并重置一些状态),然后包含运行模式的框被重新分配,新的运行模式被加载。加载运行模式时,它必须能够访问
状态
结构,以修改和/或读取运行模式正常工作所必需的某些内容,卸载时,它必须能够重置该状态。这是我的密码:

trait运行模式{
fn加载(&mut自身,状态:&mut状态);
...
fn卸载(&mut self,状态:&mut state);
}
结构状态{
运行模式:Box,
...
}
impl状态{
发布fn设置运行模式(&mut self,mut new\u运行模式:框){
self.runmode.unload(self);
//上面的行会导致错误
self.runmode=新运行模式;
self.runmode.load(self);
//这一行也会导致错误
}
}
您可能知道,这会导致对单个对象的多个可变引用的问题,这是不允许的。但我真的看不到解决这个问题的其他方法。该死,即使这样也无法编译:

fn开关运行模式(mut状态:状态,mut新运行模式:框){
state.runmode.unload(&mut state);
state.runmode=新运行模式;
state.runmode.load(&mut state);
}

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

假设
加载
卸载
不修改
状态。运行模式
,您可以将
状态
分为两部分:
运行模式
非运行模式

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

这应该让编译器明白,只有
状态
的不同部分被修改。

卸载
自我
状态中。运行模式
将成为可变别名,这将导致未定义的行为。
trait Runmode {
    fn load(&mut self, state: &mut NonRunMode);
    ...
    fn unload(&mut self, state: &mut NonRunMode);
}