编写一个宏来迭代枚举的所有值并创建一个 const

问题描述 投票:0回答:1

我有一个

enum
,我也想在
const
语句中将其用作
match
。我正在尝试创建一个如下所示的宏:

#[macro_export]
macro_rules! enum_consts {
    ($name:ident) => {
        // Use the iter method to get the iterator
        for variant in $name::iter() {
            // Use paste to create identifiers from literals
            paste::paste! {
                // Declare a const for each variant
                const [< $name _ $variant >]: u8 = variant as u8;
            }
        }
    };
}

enum Color {
    Red,
    Green
}

enum_consts!{ Color }

但是,我在迭代宏中的枚举时遇到问题,并出现以下错误:

error: macro expansion ignores token `for` and any following
 --> abc.rs:1951:9
     |
1951 |         for variant in $name::iter() {
     |         ^^^

如何解决这个问题?

rust rust-cargo
1个回答
0
投票

我认为这是一个 XY 问题,因为枚举条目已经是一种

const
s。

在您的示例中,值

Color::Red
Color::Green
是可以在 const 上下文中使用的两个值;因此我认为它们已经是类似 const 的了。我认为将它们再次单独声明为
const
值没有任何优势。

我有一个

enum
,我也想在
const
语句中将其用作
match

match
语句中使用这些值已经是可能的。事实上,这是预期的方式 -
const
值不能在
match
语句中使用。如果直接使用枚举的值,Rust 能够对
enum
执行编译时详尽性检查。

pub enum Color {
    Red,
    Green,
}

fn main() {
    let color = Color::Red;

    match color {
        Color::Red => println!("Red!"),
        Color::Green => println!("Green!"),
    }
}
Red!
© www.soinside.com 2019 - 2024. All rights reserved.