【发布时间】:2014-12-06 08:07:40
【问题描述】:
我正在尝试压缩一些重复代码,其结构类似于:
match self.foo() {
None => self.bar(),
Some(MyStruct { foo: x, .. }) => match x {
Pattern1 => result,
Pattern2 => {
block_result
}
}
}
我想写成这样的:
my_macro!(
Pattern1 => result,
Pattern2 => {
block_result
}
)
避免重复的None 处理和MyStruct 解构。
这看起来应该很简单,因为它本质上只是将宏体替换为匹配表达式,但我实际上看不到任何方法。
我尝试如下编写宏:
macro_rules! my_macro (
($($pat:pat => $result:expr,)*) => (
match self.foo() {
None => self.bar(),
Some(MyStruct { foo: x, .. }) => match x {
$(
$pat => $result,
)*
},
}
);
)
但这失败了,因为匹配臂的 RHS 可以是表达式或块(并且它也不处理可选地省略最后一个臂的逗号)。据我所知,没有办法指定宏模式的一部分可以是块或表达式,所以我想不出解决这个问题的方法。
理想情况下,我希望这样做,而不必编写复杂的模式来解构匹配主体,然后将它们重新组合在一起,但我认为没有任何指示符可以接受匹配表达式的主体。
您将如何编写这个宏?不写编译器插件也可以吗?
【问题讨论】:
标签: macros pattern-matching rust