在Rust中使用宏创建impl-block的问题

Ben*_*her 9 generics macros rust

我想创建一个宏生成一个给定的格式(Display,Debug包含一个通用型的结构体,...).

macro_rules! create_formatter {
    ($type_name:ident<$gen_param:ident>, $trait:path) => {
        impl<$gen_param: $trait> $trait for $type_name<$gen_param> {
            fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> {
                // isn't yet implemented 
            }
        }
    };
}
Run Code Online (Sandbox Code Playgroud)

当我稍后在代码(create_formatter!(MyStruct<T>, std::fmt::Display);)中调用宏时,编译器会给出以下反馈:

error: expected one of `,`, `=`, `>`, or `?`, found `std::fmt::Display`
--> test.rs:6:26
 |
6|         impl<$gen_param: $trait> $trait for $type_name<$gen_param> {
 |                          ^^^^^^^^
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Chr*_*son 5

这看起来很神秘!似乎问题在于解析宏的输出的方式:因为它path在宏处理期间被部分预解析为,所以它不再匹配特征绑定的解析规则.几个星期前有一个关于此事的错误.

然而,有一个好消息 - 它已被修复!这个例子实际上是工作在测试或夜间编译器(操场),但请注意,我不得不重新命名$trait,以$t作为trait是一个关键词.