gpt4 book ai didi

struct - 在 Rust 中动态生成格式化程序的宏

转载 作者:行者123 更新时间:2023-11-29 08:27:23 25 4
gpt4 key购买 nike

我正在编写一个宏来动态生成类似 Display 的格式化程序和 Debug对于包含单个泛型类型的给定结构。代码如下:

macro_rules! create_formatters {
($type_name:ident < $gen_param:ident > , $t:path) => {
impl<$gen_param: $t> $t for $type_name<$gen_param> {
fn fmt(&self, f: &mut std::fmt::Formatter) -> Result<(), std::fmt::Error> {
let output = match stringify!($t) {
"std::fmt::Display" => format!("{}", self.0),
"std::fmt::Debug" => format!("{:?}", self.0),
// other formatters will be implemented soon
};
write!(f, "Content is: {}", output)
}
}
};
}

宏被调用 create_formatters!(MyStruct<T>, std::fmt::Display);create_formatters!(MyStruct<T>, std::fmt::Debug);

编译器报如下错误:

error[E0277]: the trait bound `T: std::fmt::Debug` is not satisfied
--> <anon>:8:58
|
8 | "std::fmt::Debug" => format!("{:?}", self.0),
| ^^^^^^ the trait `std::fmt::Debug` is not implemented for `T`
...
28 | create_formatters!(Swagger<T>, std::fmt::Display);
| -------------------------------------------------- in this macro invocation
|
= help: consider adding a `where T: std::fmt::Debug` bound
= note: required by `std::fmt::Debug::fmt`

我该如何解决?

最佳答案

为什么会出现这个错误?让我们看一下 create_formatters!(MyStruct<T>, std::fmt::Display); 的扩展:

impl<T: std::fmt::Display> std::fmt::Display for MyStruct<T> {
fn fmt(&self, f: &mut std::fmt::Formatter) -> Result<(), std::fmt::Error> {
let output = match "std::fmt::Display" {
"std::fmt::Display" => format!("{}", self.0),
"std::fmt::Debug" => format!("{:?}", self.0),
// other formatters will be implemented soon
};
write!(f, "Content is: {}", output)
}
}

在这里,T仅限于 Display ,但是在 impl-body 的某个地方,你使用了 {:?}类型为 T 的格式化程序.是的,匹配案例 {:?}永远不会在运行时执行,但编译器在一般情况下无法知道。每个匹配臂的代码仍然需要生成!而这显然是不可能的。

如何解决?

可能最干净的解决方案是完全避免使用格式化字符串。如果你有一个 T 类型的变量它实现了一个特征,你可以直接调用特征的方法:

fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
self.0.fmt(f)
}

关于struct - 在 Rust 中动态生成格式化程序的宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41533360/

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