我想知道是否可以让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);
}
关于rust - Rust-混合使用默认宏和个人默认实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60002772/