仅在 Rust `Default` 实现中设置一个字段

Only setting one field in a Rust `Default` implementation

我有一个Ruststruct,里面有很多字段,都是自己Default。我想为它创建一个自定义 impl Default,具有以下语义:

  1. 其中一个字段具有自定义值
  2. 所有其他字段都从它们的 Default::default
  3. 中获取它们的值

我希望这样做:

impl Default for Foo {
    fn default() -> Self {
        Self {
            thing: 2,
            ..Default::default()
        }
    }
}

...但这实际上会导致未经检查的递归,因为 ..Default::default()Self 的每个成员调用 Self::default() 而不是 $member::default()

除了编写自定义宏或明确列出每个字段之外,是否有任何方法可以实现此目的?

您可以use the derivative crate实现这一点。它提供了一些标准库派生宏的替代版本,具有额外的可定制性:

#[derive(Debug, Derivative)]
#[derivative(Default)]
struct Foo {
    foo: u8,
    #[derivative(Default(value="2"))]
    thing: u8,
}

仅使用标准库,您可以导出 Default 以获取所有字段的默认值,或者完全手动实现它。