我有一个带有字段的结构:

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()操作。在这种情况下,我并不担心并发。

#1 楼

使用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());
}    


评论


或者让mut my_local_var = mem :: replace(&mut a.field,SomeType :: new());。两者完全相等。

–克里斯·摩根(Chris Morgan)
2014年11月24日6:25

#2 楼

如果您的类型实现Default,则可以使用std::mem::take

 #[derive(Default)]
struct SomeType;

fn foo(a: &mut A) {
    let mut my_local_var = std::mem::take(&mut a.field);
}
 


如果您的字段碰巧是一个Option,您可以使用一种特定的方法— Option::take:qbr1203为您精心包装:

 Option::take