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

标签 rust macros default

我想知道是否可以让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/

相关文章:

WPF:将画笔恢复为默认/原始

multithreading - 是否可以在当前线程中在 Tokio 的当前线程上生成工作?

vector - 如何以函数式方式将字符串向量转换为整数向量?

rust - 为什么我需要先固定一个 future ,然后才能等待对它的引用?

macros - 如何在 Clojurescript 中共享宏内的原子?

scala - 是否可以在宏中访问符号表?

c# - 在 DLL 中使用 default 关键字

vector - 将Map <Vec <u8>,Vec <u8 >>展平为Vec <u8>,然后将其返回到Map <Vec <u8>,Vec <u8 >>

c++ - 无需复制和粘贴即可重用嵌套循环

c++ - 输入 SpinBox 时点击默认的 QPushButton