我如何可以换一个新值的字段和可变引用的结构?我如何可以换一个新值的字段和可变引用的结构?(How c

2019-05-10 10:08发布

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

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


Answer 2:

如果你的领域恰好是一个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 ,就像更通用的答案显示 ,但它是很好的包裹起来为您提供:

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


文章来源: How can I swap in a new value for a field in a mutable reference to a structure?
标签: rust