如何为 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
作为 MyTrait
的 supertrait:
trait MyTrait: std::fmt::Debug {...}
有些人称此功能为“特质继承”,但超特质与支持 class 继承的语言中的基础 class 不太相似。它实际上只是对 MyTrait
的实现者的 约束 :“如果你实现 MyTrait
,你也必须实现 Debug
。”由于 dyn MyTrait
是一个实现 MyTrait
的类型,它也有自己的(自动生成的)Debug
实现,只是遵从具体类型的 Debug
。
但是,您不能 upcast a trait object to a supertrait,至少不能不做一些额外的工作。
我有一个特征 MyTrait,所有实现都可以实现 fmt::Debug。
我有一个包含 Vec<Rc<dyn MyTrait>>
的结构 MyStruct。
如何为 MyStruct 实现 fmt::Debug?
我的第一个想法是手动为 MyStruct 实现 Debug,但考虑到只有 MyTrait 对象的 Debug 的实现可能会有所不同,这似乎是非常错误的。
从逻辑上讲,我应该能够要求 MyTrait“包含”(在 Java 术语中,这将是接口继承)调试,然后简单地自动为 MyStruct 派生调试。 但我将如何实现这一目标?我在文档中没有找到任何与此相关的内容。
添加 Debug
作为 MyTrait
的 supertrait:
trait MyTrait: std::fmt::Debug {...}
有些人称此功能为“特质继承”,但超特质与支持 class 继承的语言中的基础 class 不太相似。它实际上只是对 MyTrait
的实现者的 约束 :“如果你实现 MyTrait
,你也必须实现 Debug
。”由于 dyn MyTrait
是一个实现 MyTrait
的类型,它也有自己的(自动生成的)Debug
实现,只是遵从具体类型的 Debug
。
但是,您不能 upcast a trait object to a supertrait,至少不能不做一些额外的工作。