enums - 如何创建一个获取枚举类型值的宏?

标签 enums macros rust

我的枚举看起来像这样:

#[derive(Clone, Debug)]
pub enum Type {
    GLnull,
    GLenum(GLenum),
    GLboolean(GLboolean),
    GLint(GLint),
    GLbyte(GLbyte),
    GLshort(GLshort),
    GLclampx(GLclampx),
    GLubyte(GLubyte),
    GLushort(GLushort),
    GLuint(GLuint),
    GLsizei(GLsizei),
    GLclampf(GLclampf),
    GLdouble(GLdouble),
    GLclampd(GLclampd),
    GLfloat_4fv((GLfloat, GLfloat, GLfloat, GLfloat)),
    GLfloat(GLfloat),
    GLintptr(GLintptr),
    GLsizeiptr(GLsizeiptr),
    GLbitfield(GLbitfield),
    GLchar_ptr(String),
}

macro_rules! get{
    ($e:expr) => {
        match $e {
            Type::GLsizei(x) => { x }
            Type::GLbitfield(x) => { x }
            _ => { 0 }
        }
    }
}

现在如何创建一个获取枚举类型值的宏?

最佳答案

就像@aochagavia 说的那样,如果你必须用你的枚举做特定的事情,那么拥有一个宏是没有意义的。

下面的宏可以帮助你,目的是让一个宏创建一个枚举并生成一些方法。这仅在所有变体都具有一种类型时才有效。

macro_rules! foo {
    ($($(#[$meta:meta])* foo $name:ident($ty:ty),)*) => {
        #[derive(Debug, Clone)]
        pub enum Foo {
            $($(#[$meta])* $name($ty),)*
        }
        impl Foo {
            pub fn display(&self) {
                match *self {
                    $(Foo::$name(x) => println!("{}", x),)*
                }
            }
        }
    }
}

foo! {
    foo A(i32),
    foo B(i64),
}

fn main() {
    let a = Foo::A(32);
    let b = Foo::B(64);

    a.display();
    b.display();
}

original宏来自@koka-el-kiwi,我将其作为示例并根据您的情况进行修改。

关于enums - 如何创建一个获取枚举类型值的宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41319276/

相关文章:

java - 对通过values()获得的枚举常量调用函数

php - 从 CSV 中抓取,序列化选定的字段并修改 CSV

c - 定义预处理器宏 swap(t, x, y)

rust - 从 graphql-client 转义宏中的关键字

rust - 如何将沉没从0.1 future 转换为0.3 future

rust - 如何复制而不是借用 i64 到 Rust 的闭包中?

java - 接口(interface)中构造函数的要求

c - 在 C 中访问枚举成员

c# - 在 C# 中获取名称及其枚举值的好方法

c - gcc 标准头文件中有这么多括号