仅在 Rust“默认”实现中设置一个字段

yos*_*ian 7 traits rust

我有一个struct带有大量字段的 Rust,所有这些字段都是它们自己Default。我想impl Default为它创建一个自定义,具有以下语义:

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

我希望这样做:

impl Default for Foo {
    fn default() -> Self {
        Self {
            thing: 2,
            ..Default::default()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

除了编写自定义宏或显式列出每个字段之外,有什么方法可以实现此目的吗?

Sve*_*ach 6

您可以使用derivativecrate来实现此目的。它提供了一些标准库派生宏的替代版本,并具有额外的可定制性:

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

只需使用标准库,您就可以派生Default以获取所有字段的默认值,或者完全手动实现它。