Rust - 混合默认宏和个人默认实现
Rust - Mix default macro and personal default implementation
我想知道是否可以让 Rust 使用宏 #[derive(Default)]
为我的结构定义默认实现,但为某些字段定义一些默认值。
我想这样做是为了避免在 Rust 可以做到的情况下定义所有字段的默认值。
感谢您的宝贵时间
据我所知derive(Default)
是全有或全无。
但是,您可以使用 field: Default::default()
初始化 Default
able 字段(这可能已经很简单了)。您可以使用这个事实来编写一个宏,它接受所有 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);
}
我想知道是否可以让 Rust 使用宏 #[derive(Default)]
为我的结构定义默认实现,但为某些字段定义一些默认值。
我想这样做是为了避免在 Rust 可以做到的情况下定义所有字段的默认值。
感谢您的宝贵时间
据我所知derive(Default)
是全有或全无。
但是,您可以使用 field: Default::default()
初始化 Default
able 字段(这可能已经很简单了)。您可以使用这个事实来编写一个宏,它接受所有 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);
}