gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 07:44:49 25 4
gpt4 key购买 nike

我想创建一个宏,为包含单个泛型类型的结构生成给定的格式化程序(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> {
| ^^^^^^^^

我做错了什么?

最佳答案

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

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

关于generics - 在 Rust 中使用宏创建 impl-block 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41523542/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com