rust - 如何更新结构,将大部分但不是所有字段设置为默认值?

标签 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;
    // ...
    

最佳答案

我会将整个 self 替换为默认值,然后保留先前值中有趣的字段:

use std::mem;

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

关于rust - 如何更新结构,将大部分但不是所有字段设置为默认值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42699222/

相关文章:

Rust:将标准输出写入缓冲区或字符串

debugging - 通过写入 std::io::stdout() 输出不可见

function - 如何使用任意类型作为函数参数?

rust - 如何在实现特征时避免函数名冲突?

rust - 如何从BytesMut中移动一系列元素?

rust - 如何使用 Diesel 查询 JSON 字段?

rust - 错误[E0658] : `cfg(doctest)` is experimental and subject to change

rust - 整个Box都可以 move 时,Box可以 move 其内容吗?

rust - 打印!错误 : expected a literal/format argument must be a string literal

rust - 如何无损地传播子进程的退出代码作为我自己程序的退出代码