Rust - 混合默认宏和个人默认实现

Rust - Mix default macro and personal default implementation

我想知道是否可以让 Rust 使用宏 #[derive(Default)] 为我的结构定义默认实现,但为某些字段定义一些默认值。

我想这样做是为了避免在 Rust 可以做到的情况下定义所有字段的默认值。

感谢您的宝贵时间

据我所知derive(Default)是全有或全无。

但是,您可以使用 field: Default::default() 初始化 Defaultable 字段(这可能已经很简单了)。您可以使用这个事实来编写一个宏,它接受所有 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);
}