Rust 我可以';枚举';生锈';什么是可变宏?

Rust 我可以';枚举';生锈';什么是可变宏?,rust,rust-macros,Rust,Rust Macros,基本上我有一个宏,看起来像: macro\u规则!my_宏{ ($expr:expr;$($pat:pat),*)=>{ 匹配$expr{ $( $pat=>$(这里有一些宏魔术), )* } } } 是否有任何东西可以进入$(这里有一些宏魔术),以便 my_宏!(foo;A、B、C) 将扩展到 匹配foo{ A=>2, B=>4, C=>6, } ? 是否有其他方法可以让我获得类似的功能,有效地“枚举”宏的输入序列 我想我可能可以编写一个递归宏来获得类似的效果,但我想知道是否有一种比我所

基本上我有一个宏,看起来像:

macro\u规则!my_宏{
($expr:expr;$($pat:pat),*)=>{
匹配$expr{
$(
$pat=>$(这里有一些宏魔术),
)*
}
}
}
是否有任何东西可以进入
$(这里有一些宏魔术)
,以便

my_宏!(foo;A、B、C)
将扩展到

匹配foo{
A=>2,
B=>4,
C=>6,
}
?

是否有其他方法可以让我获得类似的功能,有效地“枚举”宏的输入序列


我想我可能可以编写一个递归宏来获得类似的效果,但我想知道是否有一种比我所想的更优雅/惯用的方法,因为宏不允许以任何形式存储或操作“变量”,所以这个问题变得非常困难。但是,您可以使用迭代器执行相同的操作,方法是创建一个迭代器,以您希望的方式“枚举”输入(例如,使用),然后在
$中简单地调用
iterator.next().unwrap()
(这里有一些宏魔术)

您不能创建这样的
match
语句,因为Rust不允许通过宏创建
match
分支,也就是说,这现在不起作用:

匹配val{
我的宏!(A、B、C)
}
然而,在这种情况下,我们可以通过使用嵌套的
if let
块和递归宏来“破解它”:

macro\u规则!my_宏{
($expr:expr;$($pat:pat),*)=>{
my_宏!($expr;2,2;$($pat),*)
};
($expr:expr;$curr:expr,$step:literal;$pat:pat)=>{
如果让$pat=$expr{
$curr
}否则{
遥不可及!()
}
};
($expr:expr;$curr:expr,$step:literal;$pat:pat,$($rest:pat),*)=>{
如果让$pat=$expr{
$curr
}否则{
my_宏!($expr;$curr+$step,$step;$($rest),*)
}
}
}

它将生成嵌套条目,并添加足够的
2
,以创建预期的常量。或者,您可以用乘法替换它,但无论如何,编译器都应该对它进行优化