Enums 如何使用宏生成可能包含或不包含关联值的枚举变量?
我试图制作一个宏来定义一些表示汇编指令的枚举变量 现在,我有下面的方法,效果很好。这是非常无用的,但最终我将添加一些自动派生的方法,以便在以后有一个用途:Enums 如何使用宏生成可能包含或不包含关联值的枚举变量?,enums,rust,rust-macros,Enums,Rust,Rust Macros,我试图制作一个宏来定义一些表示汇编指令的枚举变量 现在,我有下面的方法,效果很好。这是非常无用的,但最终我将添加一些自动派生的方法,以便在以后有一个用途: macro_rules! define_instructions { ($($inames:tt),+ $(,)*) => { #[derive(Debug)] pub enum Instruction { $($inames),* } }; }
macro_rules! define_instructions {
($($inames:tt),+ $(,)*) => {
#[derive(Debug)]
pub enum Instruction {
$($inames),*
}
};
}
define_instructions! {
PsqLux,
PsqLx,
Twi,
}
fn main() {}
问题是,我将要添加的大多数(但不是所有)变体都需要关联值:
define_instructions! {
PsqLux(u32, u32, u32, u32, u32),
PsqLx(u32, u32, u32, u32, u32),
Twi(u32, u32, u32),
SomethingWithoutAVariant,
}
我尝试使用它来允许变量具有关联的值(它实际上还不支持关联的值,这只是一个开始):
该代码给了我以下错误:
错误:应为“(”、“=”、“{”或“}”中的一个,已找到“`
-->src/main.rs:17:32
|
17 |定义指令!{@define$($inames)*}
|^此处应为“(”、“、=”、“{”或“}”之一
...
22 |/定义|说明{
23 | | PsqLux,
24 | | PsqLx,
25 | | Twi,
26 | | }
|在这个宏调用中
似乎我不能在enum
定义中使用宏。假设这是真的,我如何解决这个问题并生成可能包含或不包含关联值的enum变量
注意:我肯定我添加的规则有问题,但我至少希望能够达到我可以调用它们的程度,这样我就可以让它们工作
编辑
另一种方法来做我想做的事情,这在目前是很有帮助的
但是,我仍然想知道如何在枚举定义中使用宏,因为将来我可以像这样编写宏:
define_instructions! {
/// Name: Trap Word Immediate
/// Simplified Mnemonics:
/// twgti rA, value = twi 8, _rA, _value
/// twllei rA, value = twi 6, _rA, _value
twi TO, rA, SIMM;
// and so on...
}
// That macro would become
pub enum Instruction {
/// Name: Trap Word Immediate
/// Usage: twi TO, rA, SIMM
/// Simplified Mnemonics:
/// twi 8, rA, value = twgti rA, value
/// twllei rA, value = twi 6, rA, value
Twi(u32, u32, u32, u32, u32),
}
所以我有了解决办法,但我仍然好奇是否可以在
enum
定义中使用宏。这可能吗?如果不可能,为什么不可能?您的目标到底是什么?一个更简单的匹配器,如($($inames:tt)*=>{enum指令{$($inames)*}
工作正常,所以我猜您正在尝试对变体做更多的操作,这将有助于描述。啊,谢谢,这有助于我现在尝试的操作。我没想过要尝试(这是我在Rust中的第一个宏,所以我仍在弄清楚这一切)。虽然稍后将宏放在那里可能有助于其他内容,因此我将更新问题,以包括可能的内容。您希望宏修改文档注释吗?我还没有真正计划好,这可能是个坏主意。我只是急于获取有关该问题的示例。主要的一点是枚举RIANT是从文档中创建的。我可以删除其余的细节来关注它。此外,您希望将twi
修改为twi
,并以某种方式直觉地认为3个值to、rA、SIMM
变成5u32
?听起来您正试图将实际的汇编程序实现为一个宏。。。
define_instructions! {
/// Name: Trap Word Immediate
/// Simplified Mnemonics:
/// twgti rA, value = twi 8, _rA, _value
/// twllei rA, value = twi 6, _rA, _value
twi TO, rA, SIMM;
// and so on...
}
// That macro would become
pub enum Instruction {
/// Name: Trap Word Immediate
/// Usage: twi TO, rA, SIMM
/// Simplified Mnemonics:
/// twi 8, rA, value = twgti rA, value
/// twllei rA, value = twi 6, rA, value
Twi(u32, u32, u32, u32, u32),
}