我有一个字段一个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()
操作。 我并不担心在这种情况下并发。
使用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());
}
如果你的领域恰好是一个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?