[英]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 }
}
除了“定制”变体外,它还有Array1
到Array8
。 不幸的是,这些都没有编译:它抱怨感叹号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.