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

How to get an implementation of fmt::Debug for a Vec of dyn Trait objects?

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

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

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

添加 Debug 作为 MyTraitsupertrait:

trait MyTrait: std::fmt::Debug {...}

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

但是,您不能 upcast a trait object to a supertrait,至少不能不做一些额外的工作。