如何在结构的可变引用中为字段交换新值?

arc*_*rty 16 rust

我有一个带字段的结构:

struct A {
    field: SomeType,
}
Run Code Online (Sandbox Code Playgroud)

给定a &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.
}
Run Code Online (Sandbox Code Playgroud)

最终目标相当于一项get_and_set()行动.在这种情况下,我并不担心并发性.

Fra*_*gné 24

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

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

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

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

  • 或者`let mut my_local_var = mem :: replace(&mut a.field,SomeType :: new());`.这两者完全相同. (10认同)

She*_*ter 10

如果你的领域恰好是一个Option,你可以使用一种特定的方法 - Option::take:

struct A {
    field: Option<SomeType>,
}

fn foo(a: &mut A) {
    let old = a.field.take();
    // a.field is now None, old is whatever a.field used to be
}
Run Code Online (Sandbox Code Playgroud)

实行take用途mem::replace,就像更通用的答案显示,但它是很好的包裹起来为您提供:

pub fn take(&mut self) -> Option<T> {
    mem::replace(self, None)
}
Run Code Online (Sandbox Code Playgroud)