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

时间:2017-03-09 15:27:48

标签: rust

我知道Rust特有的功能:

Foo {
    fieldX: someValue,
    ..Self::default()
}

我希望在&mut self的方法中使用此功能,而不是触及字段f10f11并将其他字段设置为默认值:

#[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;
    }
}

但是编译器说:

error[E0507]: cannot move out of borrowed content
  --> src/main.rs:12:18
   |
12 |             f10: self.f10,
   |                  ^^^^ cannot move out of borrowed content

我怎么能:

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

    self.f1 = 0;
    self.f2 = 0;
    self.f3 = None;
    // ...
    

1 个答案:

答案 0 :(得分:5)

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

use std::mem;

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