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

时间:2017-01-07 16:17:42

标签: generics macros rust

我想为包含单个泛型类型的结构创建一个生成给定格式化程序(DisplayDebug,...)的宏。

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 
            }
        }
    };
}

当我稍后在代码(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> {
 |                          ^^^^^^^^

我做错了什么?

1 个答案:

答案 0 :(得分:5)

这看起来很神秘!似乎问题在于解析宏的输出的方式:因为它在宏处理期间被部分预解析为path,所以它不再匹配解析规则特质约束。关于此问题有一个bug raised a few weeks ago

然而,有好消息 - it's been fixed!该示例实际上适用于测试版或夜间编译器(playground),但请注意我必须将$trait重命名为$t,因为trait是关键字。