首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用宏引入Rust枚举变体?

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

Stack Overflow用户
提问于 2020-05-18 09:00:16
回答 1查看 350关注 0票数 1

我想使用Rust宏来介绍枚举变体以及“定制”的枚举变体。举个简单的例子:

代码语言:javascript
复制
macro_rules! make_beta {
    () => {Beta}
}

enum Greek {
    Alpha,
    make_beta! ()
}

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

代码语言:javascript
复制
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

如何通过宏引入枚举变体?

EN

回答 1

Stack Overflow用户

发布于 2020-05-20 15:04:53

您可以在宏中定义enum,而不是在enum中定义宏,如下所示:

代码语言:javascript
复制
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板条箱:

代码语言:javascript
复制
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]
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61860849

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档