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

时间:2014-11-24 05:58:37

标签: rust

我有一个带字段的结构:

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

2 个答案:

答案 0 :(得分:20)

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

答案 1 :(得分:8)

如果您的字段恰好是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
}

take的实施使用mem::replace,就像the more generic answer shows一样,但它很适合你:

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