You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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>>,
    }
);

说明

  1. tipey宏:用ty片段匹配完整类型,可正确识别Vec<String>、Vec<Option<String>>等嵌套泛型类型。
  2. structy宏:直接用ty匹配结构体字段的完整类型,无需手动拆分泛型参数,既简化了宏结构,又提升了兼容性,能处理Vec<Vec<String>>、HashMap<String, i32>等更复杂的类型。

内容的提问来源于stack exchange,提问作者ditoslav

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 07:50:26