How can I swap in a new value for a field in a mutable reference to a structure?

后端 未结 2 1357

I have a struct with a field:

struct A {
    field: SomeType,
}

Given a &mut A, how can I move the value of field

2条回答
  •  悲&欢浪女
    2020-11-22 06:53

    If your type implements Default, you can use std::mem::take:

    #[derive(Default)]
    struct SomeType;
    
    fn foo(a: &mut A) {
        let mut my_local_var = std::mem::take(&mut a.field);
    }
    

    If your field happens to be an Option, there's a specific method you can use — 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
    }
    

    The implementation of Option::take uses mem::take, just like the more generic answer above shows, but it is wrapped up nicely for you:

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

提交回复
热议问题