如何在 Rust 中编译时检查一个 trait 是否被实现?

3

如果实现了Display特性,则打印变量;否则使用Debug特性。所有类型在编译时均已知。

let display = MyDisplayType::new(); // implements Display
let debug = MyDebugType::new(); // implements Debug

output!(display); // uses Display a.k.a. println!("{}", display);
output!(debug); // uses Debug a.k.a. println!("{:?}", debug);

什么是最干净的方法?

它与其他问题有何不同? - Shepmaster
2
我认为其他问题与此无关。我只需要一个宏(而不是函数),如果未实现Display,则使用Debug打印变量。 - hedgar2017
2
宏展开为代码,但在展开时,类型信息尚不可用。因此,宏无法帮助解决问题。无论如何,如果您想使用“Display”或“Debug”进行格式化,那么您可能只需要使用“Debug”。 - mcarton
1
@Boiethios,它是一个副本。符合我的问题。 - hedgar2017
7
我认为这不是重复的问题。 编译时间!=运行时。我正在尝试找出如何在编译时断言变量实现一个特质。 这个问题有些相似,但并不完全相同。 :( - LordCecil
显示剩余5条评论
1个回答

1

如果您想在编译时断言类型实现了一个 trait,这是可能的。例如,在单元测试中,您可以创建一个针对该 trait 的函数。如果类型没有实现 trait,则代码将无法编译。

fn implements_the_trait<T: MyTrait>() {}

#[test]
fn implements_my_trait() {
  implements_the_trait::<MyType>();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接