我想知道是否可以让Rust使用宏为我的结构定义默认实现,#[derive(Default)]
但为某些字段定义一些默认值。
我想这样做是为了避免在Rust可以做到时定义所有字段的默认值。
谢谢你的时间
据我所知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);
}
感谢您的回答和示例。我刚刚发现了这个:github.com/idanarye/rust-smart-default。看起来真的很酷。