温馨提示:本文翻译自stackoverflow.com,查看原文请点击:rust - Mix default macro and personal default implementation

rust - 混合使用默认宏和个人默认实现

发布于 2020-03-31 23:11:08

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

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

谢谢你的时间

查看更多

提问者
Aurélien Foucault
被浏览
51
phimuemue 2020-01-31 19:33

据我所知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);
}