我有一个
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() {
| ^^^
如何解决这个问题?
我认为这是一个 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!