如何获得 dyn Trait 对象的 Vec 的 fmt::Debug 实现?

Kaf*_*ein 5 traits rust

我有一个特征 MyTrait,其所有实现都可以实现 fmt::Debug。我有一个结构 MyStruct,其中包含一个Vec<Rc<dyn MyTrait>>. 如何为 MyStruct 实现 fmt::Debug?

我的第一个想法是手动实现 MyStruct 的 Debug,但这似乎非常错误,因为只有 MyTrait 对象的 Debug 实现可能会有所不同。

从逻辑上讲,我应该能够要求 MyTrait“包含”(用 Java 术语来说,即接口继承)调试,然后简单地自动派生 MyStruct 的调试。但我该如何实现这一目标呢?我在文档中没有找到任何与此效果相关的内容。

tre*_*tcl 8

添加Debug作为 的超级特征MyTrait

trait MyTrait: std::fmt::Debug {...}
Run Code Online (Sandbox Code Playgroud)

有些人将此功能称为“特征继承”,但超特征与支持类继承的语言中的基类不太相似。这实际上只是对实现者的一个限制MyTrait:“如果你实现了MyTrait,你也必须实现Debug。” 由于dyn MyTrait是 实现 的类型MyTrait,因此它也有自己的(自动生成的)Debug实现,该实现仅遵循Debug具体类型的 。

然而,你不能将一个特质对象升级为超级特质,至少在没有一些额外工作的情况下是这样。