Vault
对象包含一个
directories
字段,该字段是vec
对象的Directory
struct Vault{
directories: Vec<Directory>
}
。所以像这样的东西
VaultManager
要在保险库上操作,我有一个DirectoryManager
类。要在目录上操作,我有DirectoryManager
类。这是因为我正在使用Protobuff,这使生活变得更加轻松。从
VaultManager::open_dir
方法获得,并参考了一个目录。
VaultManager
问题是以下内容。 我想实现一个替补程序,可以在其中输入打开,关闭和修改不同目录的命令。当我执行多个命令时,该状态应更新。我的最初想法是具有一个保持状态的对象,并且命令实现
struct DirectoryManager<'a>{
dir: &'a Directory
}
特征反复修改Repl
状态。
ReplCommand
但是,此API不起作用,因为Repl
struct Repl<'a> {
vm: VaultManager,
running: bool,
dm: Option<DirectoryManager<'a>>,
}
trait ReplCommand: Sized {
fn execute(&self, repl: &mut Repl) -> Result<()>;
}
,因此,一旦我实例化,我就无法将其重置回
dm
并打开另一个目录。这是因为一生基本上强迫
vm
如果我的理解是正确的,就可以生存与
dm
实例本身。
因此,我如何在不自我引用和避免克隆的情况下逐步更新此状态
None
?
? 我还想避免使用一些板条箱游戏。我坚信一个更好的设计,可以避免这种情况。我会做的是
从将所有权从所有权中转移到VM,这可以确保所有参考都是相同的寿命。 这意味着保险库将需要在复制之外生活。
dm
,我认为这是将枚举用于不同命令而不是使用特质的更好的主意。
由于depp命令应该是纯数据,使其特征使得在端点很难消耗。示例repl
Repl
Directories