gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:34:15 25 4
gpt4 key购买 nike

我的枚举看起来像这样:

#[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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com