是否可以判断一个类型是否覆盖了默认的 trait 实现?

时间:2021-07-08 02:47:31

标签: rust

这里我有一个带有两个函数的特征,两个函数都有一个默认实现。有什么方法可以判断哪些函数具有默认实现,哪些函数被每种类型覆盖?

https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=f3239e7faa9fb5117e32afe7ae43c687

我以为我可以比较函数的地址,但似乎每种类型都有自己独特的函数指针,无论如何。我做对了吗?

你可能会问我为什么首先要做这样的事情。这是一个插件系统。每个插件都可以覆盖 Plugin trait 上的一部分功能,但是在注册插件时,我想知道插件实现了哪些 trait 函数(而不是只有默认实现。)

可能这可以通过将寄存器函数设为宏来实现?

1 个答案:

答案 0 :(得分:2)

由于编译器优化,函数指针将不可靠。例如,如果您在 release 中构建,您将看到 <C as Foo>::bar<C as Foo>::baz 的相同地址,因为编译器将它们组合在一起,因为它们包含相同的主体 (playground)

宏可以生成其他函数,例如 fn override_foo() -> bool { true } 并可以确定它是否已被覆盖,但对于插件系统,我可能会坚持使用 Option<T> 包裹的函数指针并传入一个结构体。

相关问题