我想使用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 }
}除了“定制”变体之外,它还通过Array8实现了Array1。不幸的是,这两种方法都不能编译:它会报错感叹号example。
如何通过宏引入枚举变体?
发布于 2020-05-20 15:04:53
您可以在宏中定义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]
}https://stackoverflow.com/questions/61860849
复制相似问题