我想为包含单个泛型类型的结构创建一个生成给定格式化程序(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
}
}
};
}
当我稍后在代码(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> {
| ^^^^^^^^
我做错了什么?
答案 0 :(得分:5)
这看起来很神秘!似乎问题在于解析宏的输出的方式:因为它在宏处理期间被部分预解析为path
,所以它不再匹配解析规则特质约束。关于此问题有一个bug raised a few weeks ago。
然而,有好消息 - it's been fixed!该示例实际上适用于测试版或夜间编译器(playground),但请注意我必须将$trait
重命名为$t
,因为trait
是关键字。