我想收集对 struct 的更改,并同时应用它们.

enum SomeEnum {
    Foo,
    Bar,
}

struct SomeStruct {
    attrib: SomeEnum,
    next_attrib: Option<SomeEnum>,
}

impl SomeStruct {
    pub fn apply_changes(&mut self) {
        if let Some(se) = self.next_attrib {
            self.attrib = se;
        }
        self.next_attrib = None;
    }
}

这将产生以下编译器错误:

error[E0507]: cannot move out of borrowed content
  --> src/lib.rs:13:27
   |
13 |         if let Some(se) = self.next_attrib {
   |                     --    ^^^^ cannot move out of borrowed content
   |                     |
   |                     hint: to prevent move, use `ref se` or `ref mut se`

我找到了Get an enum field from a struct: cannot move out of borrowed content,并在我的枚举定义中添加了#[derive(Clone, Copy)].

这可能有效,但我对(隐式地)使用复制感到不舒服,因为这通常也会发生在更大的数据类型上.

实际所有者永远不会移出 struct .

有没有其他方法可以做到这一点,而不向enum的所有用户公开Copy/Clone特征?

推荐答案

基本上,如果self.attrib仍然归self.next_atrrib所有,就不能将该值赋给self.attrib.这意味着您需要从self.next_attrib中删除该值,然后将所有权赋予self.attrib.

一种方法是手动替换该值.例如,可以使用std::mem::replace将值替换为None,并将当前值的所有权设置为next_attrib.然后你可以取这个值,如果它是Some(_),你可以把它的内容放在self.attrib

impl SomeStruct {
    pub fn apply_changes(&mut self) {
        let next_attrib = std::mem::replace(&mut self.next_attrib, None);
        if let Some(se) = next_attrib {
            self.attrib = se;
        }
    }
}

然而,由于这是一种相对常见的模式,Option上有一个实用功能,用于处理您希望拥有Option内容并将Option设置为None的情况.Option::take法就是你想要的.

impl SomeStruct {
    pub fn apply_changes(&mut self) {
        if let Some(se) = self.next_attrib.take() {
            self.attrib = se;
        }
    }
}

另见:

Rust相关问答推荐

如何定义使用拥有的字符串并返回拥有的Split的Rust函数?

为什么我不能从带有字符串的 struct 的引用迭代器中收集VEC<;&;str&>?

这种获取-释放关系是如何运作的?

为什么Rust函数的移植速度比C++慢2倍?

为什么这是&q;,而让&q;循环是无限循环?

用 rust 蚀中的future 展望 struct 的future

在使用AWS SDK for Rust时,如何使用硬编码访问密钥ID和密钥凭据?

重写Rust中的方法以使用`&;mut self`而不是`mut self`

我如何制作一个变异迭代器来锁定内部数据直到删除?

Rust 的多态现象.AsRef与Derf

在复制类型中使用std::ptr::WRITE_VILAR进行内部可变性的安全性(即没有UnSafeCell)

更新 rust ndarray 中矩阵的一行

Rust 中指向自身的引用如何工作?

部署Rust发布二进制文件的先决条件

为什么Rust中无法推断生命周期?

Rust Redis 中的 HSET 命令问题

简单 TCP 服务器的连接由对等重置错误,mio 负载较小

错误:将自定义 proc_macro 与用Rust 的宝贝编写的属性一起使用时,无法在此范围内找到属性

Rust 异步和 AsRef 未被发送

HashMap entry() 方法使borrow 的时间比预期的长