如何在macro_rules中解析嵌套可选令牌以解决>>语法错误?
修正Rust宏解析"no rules expected the token >>"错误
问题根源
原宏定义用tt(token tree)片段手动拆分泛型类型,遇到嵌套泛型的>>时,宏解析器会将其识别为单个右移运算符token,而非两个闭合的>,导致模式匹配失败触发错误。另外,tt并不适合匹配完整的类型结构,尤其是带嵌套泛型的复杂类型。
修正方案
改用ty(类型)片段专门匹配类型,ty是Rust宏系统提供的用于匹配合法Rust类型的片段标识符,能自动将嵌套泛型中的>>解析为两个独立的>,无需手动拆分泛型结构。
修正后的宏代码
macro_rules! tipey { (Vec<$pt: ty>) => { 2 }; (Vec<Option<$pt: ty>>) => { 3 }; ($pt: ty) => { 1 }; } macro_rules! structy { (struct $i: ident { $($p: ident: $pt: ty),+ $(,)? }) => { const v: &[usize] = &[ $(tipey!($pt)),+ ]; }; } // 调用测试 structy!( struct ContentDetails { pattern: String, fields: Vec<Option<String>>, } );
说明
tipey宏:用ty片段匹配完整类型,可正确识别Vec<String>、Vec<Option<String>>等嵌套泛型类型。structy宏:直接用ty匹配结构体字段的完整类型,无需手动拆分泛型参数,既简化了宏结构,又提升了兼容性,能处理Vec<Vec<String>>、HashMap<String, i32>等更复杂的类型。
内容的提问来源于stack exchange,提问作者ditoslav
相关产品推荐
相关产品推荐

