仅在 Rust `Default` 实现中设置一个字段
Only setting one field in a Rust `Default` implementation
我有一个Ruststruct
,里面有很多字段,都是自己Default
。我想为它创建一个自定义 impl Default
,具有以下语义:
- 其中一个字段具有自定义值
- 所有其他字段都从它们的
Default::default
中获取它们的值
我希望这样做:
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
以获取所有字段的默认值,或者完全手动实现它。
我有一个Ruststruct
,里面有很多字段,都是自己Default
。我想为它创建一个自定义 impl Default
,具有以下语义:
- 其中一个字段具有自定义值
- 所有其他字段都从它们的
Default::default
中获取它们的值
我希望这样做:
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
以获取所有字段的默认值,或者完全手动实现它。