我有一个结构 App
:
struct App {
cmd: Command
}
拥有
Command
类型的命令:enum Command {
Cmd1 { flag: bool }
}
(我使用 StructOpt 从中派生出一个命令行界面。)
要执行正确的命令,我有一个这样的功能:
impl App {
fn execute(&mut self) {
match &self.cmd {
Command::Cmd1 { flag } => self.do_cmd1(*flag)
};
}
}
我在一个额外的函数中处理实际执行
do_cmd1(&mut self, flag: bool)
保留 execute
干净的。但是,这不起作用,因为在
self.do_cmd1(*flag)
中我借 self
通过 *flag
既可变又不可变属于cmd
这又属于 self
.我的问题是:访问
flag
的正确方法是什么?在 do_cmd1
尊重借款规则?澄清:我需要这个也适用于类似的事情
enum Command {
Cmd2 { text: String }
}
其中变体的字段不是
Copy
.
最佳答案
如果您将标志移出或复制出 self
调用前 do_cmd1
,借用不需要重叠。
fn execute(&mut self) {
match self.cmd {
Command::Cmd1 { flag } => self.do_cmd1(flag),
};
}
唯一的变化是删除
&
来自 &self.cmd
和 *
来自 *flag
.以上工作是因为
bool
是 Copy
类型。对于不是 Copy
的类型,您需要做一些额外的工作以确保借用不会重叠,如以下相关问题:关于rust - 访问枚举变量字段的正确方法,该字段本身就是结构的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60451635/