【问题标题】:How do I check if a trait is implemented at compile time in Rust?如何在 Rust 编译时检查 trait 是否实现?
【发布时间】:2019-01-19 13:57:30
【问题描述】:

如果已实现,我想打印带有 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);

什么是最干净的方法?

【问题讨论】:

  • 我相信Is it possible to check if an object implements a trait at runtime?的答案已经回答了您的问题。如果您不同意,请edit您的问题解释差异。否则,我们可以将此问题标记为已回答。
  • 我认为其他问题不相关。如果未实现 Display,我只需要一个宏(不是函数),它使用 Display 或 Debug 打印变量。
  • 宏扩展为代码,在它们扩展时,类型信息尚不可用。所以宏不会有帮助。无论如何,如果您想使用DisplayDebug 进行格式化,这可能意味着您只需要Debug
  • @Boiethios,复制它。适合我的问题。
  • 我会说这不是重复的。编译时间!=运行时间。我试图弄清楚如何在编译时断言变量实现了一个特征。这是相似的,但不完全相同的问题。 :(

标签: reflection rust polymorphism output traits


【解决方案1】:

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

fn implements_the_trait<T: MyTrait>() {}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多