Rust macro_rules可选模式元变量重复次数不匹配问题解决方案问询
错误原因
Rust 的 macro_rules! 要求嵌套重复块中,内层元变量的重复次数必须和外层重复块的次数严格对齐。你代码中外层的可选块 $(...)? 重复次数为1次,但块内用到的$account 元变量的重复次数为2次,次数不匹配因此触发编译错误。
解决方案
最通用且无额外依赖的绕过方法是拆分宏为内部规则,将seeds结构体的生成逻辑独立出来:
macro_rules! accounts_struct { // 内部规则1:传入了seeds结构体名时生成对应结构体 (@gen_seeds $seeds_name:ident { $($account:ident,)* }) => { pub struct $seeds_name { $( pub $account: u8, )* } }; // 内部规则2:未传入seeds结构体名时不生成任何内容 (@gen_seeds { $($account:ident,)* }) => {}; // 主入口规则 ( $( #[seeds: struct $StructSeedsName:ident] )? struct $StructAccountsName:ident { $( pub $account:ident, )* } ) => { // 生成主Accounts结构体 pub struct $StructAccountsName { $( pub $account: String, )* } // 调用内部规则自动判断是否生成seeds结构体 accounts_struct!(@gen_seeds $($StructSeedsName)? { $($account,)* }); }; } // 原调用代码无需修改 accounts_struct! { #[seeds: struct Seeds] struct Accounts { pub foo, pub bar, } }
该方案通过内部规则重载,把重复次数不匹配的逻辑拆分到不同的规则分支中,既保留了原有的可选生成逻辑,也满足了macro_rules!的重复次数校验要求,不需要引入任何外部依赖。
内容的提问来源于stack exchange,提问作者Boiethios
相关产品推荐
相关产品推荐

