Насколько я знаю, derive(Default)
- это все или ничего.
Однако вы можете инициализировать Default
поля с помощью field: Default::default()
(что может быть уже достаточно просто). Вы можете использовать этот факт для написания макроса, который принимает все Default
доступные поля и инициализирует их, например:
macro_rules! defaultable{
(
$t: ty,
@default($($default_field:ident,)*)
@custom($($custom_field:ident = $custom_value:expr,)*)
)
=> {
impl Default for $t {
fn default() -> Self {
Self {
$($default_field: Default::default(),)*
$($custom_field: $custom_value,)*
}
}
}
}}
struct S {
n1: usize,
n2: usize,
b: bool,
non_default: usize,
}
defaultable!(S, @default(n1, n2, b,) @custom(non_default=42,));
fn main() {
let s : S = Default::default();
println!("{}", s.non_default);
}