繁体   English   中英

如何用宏引入 Rust 枚举变量?

[英]How to introduce Rust enum variants with a macro?

我想使用 Rust 宏来引入枚举变体以及“定制”变体。 作为一个简单的说明:

macro_rules! make_beta {
    () => {Beta}
}

enum Greek {
    Alpha,
    make_beta! ()
}

我真正的目标是拥有一个家庭:

macro_rules! make_variants {
    ($($N:literal)+) => {
        $(
            Array$N([u8; $N]),
        )+
    }
}

enum Stuff {
    Empty,
    Something,
    make_variants! { 1 2 3 4 5 6 7 8 }
}

除了“定制”变体外,它还有Array1Array8 不幸的是,这些都没有编译:它抱怨感叹号example

如何使用宏引入枚举变体?

除了在enum中定义宏,您可以在宏中定义enum ,如下所示:

macro_rules! enum_variants {
    ($name:ident {$($vals:tt)*} [$($tag:ident : $N:literal)+]) => {
        enum $name {
            $($vals)*
            $($tag([u8; $N])),+,
        }
    }
}

enum_variants! { Stuff {
        Empty,
        Something(i32),
    }
    [A1:1 A2:2 A3:3 A4:4 A5:5 A6:6 A7:7 A8:8]
}

fn main() {
    let x = Stuff::A3;
    let y = Stuff::Something(3);
}

UDPATE:使用 Frxstrem 在评论中提到的paste板条箱:

macro_rules! enum_variants {
    ($name:ident {$($vals:tt)*} [$($N:literal)+]) => {
        paste::item!{
            enum $name {
                $($vals)*
                $([<Array $N>]([u8; $N])),+,
            }
        }
    }
}

enum_variants! { Stuff {
        Empty,
        Something(i32),
    }
    [1 2 3 4 5 6 7 8]
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM