rust - 访问枚举变量字段的正确方法,该字段本身就是结构的字段

标签 rust borrow-checker

我有一个结构 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 .

以上工作是因为 boolCopy类型。对于不是 Copy 的类型,您需要做一些额外的工作以确保借用不会重叠,如以下相关问题:
  • Cannot borrow `*self` as mutable because `self.history[..]` is also borrowed as immutable
  • How can I call a mutating method while holding a reference to self?
  • Passing mutable self reference to method of owned object
  • 关于rust - 访问枚举变量字段的正确方法,该字段本身就是结构的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60451635/

    相关文章:

    rust - 在 Rust 中,我怎样才能减少这段代码的重复性?

    rust - 保存可变引用以备后用,即使在使用别名时也是如此

    rust - 使用 None 实例化时不指定 T 的情况下使用 Option<T> 创建通用结构

    rust - 如何处理 HashMap 中的每个值并选择性地拒绝一些值?

    methods - Rust 实现方法——在可变借用方法中使用 "getter"方法借用

    audio - 用于 lv2 插件的带有 C 字符串的静态结构

    rust - Rust是否会缩小生命周期以满足对其定义的约束?

    multithreading - 借用检查器可以知道 Arc 何时为 "released"吗?可以暂时授予“静态生命周期”吗?

    rust - 有没有办法在 Cargo.toml 中指定一个可执行文件依赖于另一个可执行文件?

    sqlite - 符号链接(symbolic link)在 Docker 镜像中丢失