¿Cómo puedo cambiar un nuevo valor para un campo en una referencia mutable a una estructura?

Tengo una estructura con un campo:

struct A { field: SomeType, } 

Dado un &mut A , ¿cómo puedo mover el valor del field e intercambiar un nuevo valor?

 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. } 

El objective final sería el equivalente de una operación get_and_set() . No estoy preocupado por la concurrencia en este caso.

Use std::mem::swap() .

 fn foo(a: &mut A) { let mut my_local_var = SomeType::new(); mem::swap(&mut a.field, &mut my_local_var); } 

O std::mem::replace() .

 fn foo(a: &mut A) { let mut my_local_var = mem::replace(&mut a.field, SomeType::new()); } 

Si su campo pasa a ser una Option , hay un método específico que puede usar: Option::take :

 struct A { field: Option, } fn foo(a: &mut A) { let old = a.field.take(); // a.field is now None, old is whatever a.field used to be } 

La implementación de take usa mem::replace , como muestra la respuesta más genérica , pero está muy bien hecha para ti:

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