如何更新结构,将大多数但不是所有字段设置为默认值?

use*_*932 3 rust

我知道Rust特有的功能:

Foo {
    fieldX: someValue,
    ..Self::default()
}
Run Code Online (Sandbox Code Playgroud)

我想在一个方法中使用它&mut self,而不是触摸字段f10并将f11其他字符设置为默认值:

#[derive(Default)]
struct Foo {
    f1: u32,
    //...
    f10: Vec<u32>,
    f11: Vec<u32>,
}

impl Foo {
    fn f1(&mut self) {
        let new_me = Foo {
            f10: self.f10,
            ..Self::default()
        };
        *self = new_me;
    }
}
Run Code Online (Sandbox Code Playgroud)

但编译说:

error[E0507]: cannot move out of borrowed content
  --> src/main.rs:12:18
   |
12 |             f10: self.f10,
   |                  ^^^^ cannot move out of borrowed content
Run Code Online (Sandbox Code Playgroud)

我怎么能够:

  1. 保留签名f1:&mut self
  2. 不复制任何Vec<>,只移动
  3. 不写无聊的代码就好

    self.f1 = 0;
    self.f2 = 0;
    self.f3 = None;
    // ...
    
    Run Code Online (Sandbox Code Playgroud)

She*_*ter 5

我将self使用默认值替换整个值,然后保留上一个值中的有趣字段:

use std::mem;

impl Foo {
    fn f1(&mut self) {
        let old = mem::replace(self, Self::default());
        self.f10 = old.f10;
    }
}
Run Code Online (Sandbox Code Playgroud)