避免自我参考结构

问题描述 投票:0回答:0
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

    

rust design-patterns lifetime api-design self-reference
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.