Rust宏接收泛型类型时出现‘no rules expected the token `<`’错误求助
解决Rust宏无法处理泛型类型参数的问题
当然可以直接用boo!(Option<i32>);这种调用方式!问题的根源在于你宏定义里的片段约束:
你原来用的是$T:ident,这个约束只能匹配单个标识符——也就是像i32、Opti32这种没有任何附加符号的单一名称。而Option<i32>是一个带类型参数的泛型类型,它包含了<、>和内部的i32,完全超出了ident的匹配范围,所以宏解析器看到<的时候就无法继续解析,抛出了你看到的错误。
最简单的解决方案:改用ty片段约束
把宏里的$T:ident换成$T:ty就搞定了!ty是Rust宏片段里专门用来匹配任意合法类型的约束,不管是基础类型、泛型类型、嵌套类型还是自定义类型,它都能完美识别。
修改后的代码如下:
macro_rules! boo { ($T:ty) => { let x: $T; }; } fn main() { boo!(i32); // 依然正常运行 boo!(Option<i32>); // 现在完全没问题了 boo!(Vec<Box<dyn std::fmt::Display>>); // 复杂嵌套类型也能轻松支持 }
额外说明
如果你需要更精确的匹配(比如只允许路径类型,不允许函数指针这类特殊类型),也可以用$T:path约束,但大多数场景下ty已经足够通用,能覆盖你几乎所有的类型需求,再也不用麻烦地写类型别名啦。
内容的提问来源于stack exchange,提问作者user1244932
相关产品推荐
相关产品推荐

