我有一个带字段的 struct :

struct A {
    field: SomeType,
}

给定一个&mut A,我如何移动field的值并交换一个新值?

fn foo(a: &mut A) {
    let mut my_local_var = a.field;
    a.field = SomeType::new();

    // ...
    // do things with my_local_var
    // some operations may modify the NEW field's value as well.
}

最终目标相当于get_and_set()次手术.我不担心这种情况下的并发性.

推荐答案

使用std::mem::swap().

fn foo(a: &mut A) {
    let mut my_local_var = SomeType::new();
    mem::swap(&mut a.field, &mut my_local_var);
}

或者std::mem::replace().

fn foo(a: &mut A) {
    let mut my_local_var = mem::replace(&mut a.field, SomeType::new());
}    

Rust相关问答推荐

SQL x中的mut *transaction和mut transaction有什么区别?

为什么我需要在这个代码示例中使用&

创建包含缺失值的框架

防止cargo test 中的竞争条件

RUST应用程序正在退出,错误代码为:(退出代码:0xc0000005,STATUS_ACCESS_VIOLATION)

可以为rust构建脚本编写单元测试吗?

如何将映射反序列化为具有与键匹配的字段的定制 struct 的向量?

如果死 struct 实现了/派生了一些特征,为什么Rust会停止检测它们?

如何在函数中返回自定义字符串引用?

为什么Option类型try块需要类型注释?

用于实现获取 struct 体 id 的特征规范

通过异常从同步代码中产生yield 是如何工作的?

为什么我可以使用 &mut (**ref) 创建两个实时 &mut 到同一个变量?

类型判断模式匹配panic

使用 traits 时,borrow 的值不会存在足够长的时间

判断 is_ok 后重用结果

为什么指定生命周期让我返回一个引用?

为什么 no_std crate 可以依赖于使用 std 的 crate?

意外的正则表达式模式匹配

TcpStream::connect - 匹配武器具有不兼容的类型