我有一个带字段的结构:
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()
操作。在这种情况下,我并不担心并发性。
答案 0 :(得分:20)
fn foo(a: &mut A) {
let mut my_local_var = SomeType::new();
mem::swap(&mut a.field, &mut my_local_var);
}
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)
}