我有一个struct带有大量字段的 Rust,所有这些字段都是它们自己Default。我想impl Default为它创建一个自定义,具有以下语义:
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.
除了编写自定义宏或显式列出每个字段之外,有什么方法可以实现此目的吗?
您可以使用derivativecrate来实现此目的。它提供了一些标准库派生宏的替代版本,并具有额外的可定制性:
#[derive(Debug, Derivative)]
#[derivative(Default)]
struct Foo {
foo: u8,
#[derivative(Default(value="2"))]
thing: u8,
}
Run Code Online (Sandbox Code Playgroud)
只需使用标准库,您就可以派生Default以获取所有字段的默认值,或者完全手动实现它。