I have a Rust struct
with a large number of fields, all of which are themselves Default
. I'd like to create a custom impl Default
for it, with the following semantics:
Default::default
Here's how I hoped to do that:
impl Default for Foo {
fn default() -> Self {
Self {
thing: 2,
..Default::default()
}
}
}
...but that actually causes unchecked recursion, since ..Default::default()
calls Self::default()
rather than $member::default()
for each member of Self
.
Is there any way to accomplish this, short of writing a custom macro or explicitly listing every field?
You can use the derivative
crate to achieve this. It provides alternative versions of some of the standard library derive macros with additional customizability:
#[derive(Debug, Derivative)]
#[derivative(Default)]
struct Foo {
foo: u8,
#[derivative(Default(value="2"))]
thing: u8,
}
Just using the standard library, you can either derive Default
to get the default values for all fields, or implement it completely manually.