rust - 如何为 dyn Trait 对象的 Vec 获取 fmt::Debug 的实现?

标签 rust traits

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

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

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

最佳答案

添加 Debug 作为 supertrait 我的特质:

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

有些人称这个特性为“trait inheritance”,但在支持类继承的语言中,supertrait 不太像基类。这实际上只是对MyTrait 实现者的约束:“如果你实现MyTrait,你也必须实现Debug ”由于 dyn MyTrait 是一个实现了 MyTrait 的类型,它也有自己的(自动生成的)Debug 实现,它只是遵从 调试具体类型。

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

关于rust - 如何为 dyn Trait 对象的 Vec 获取 fmt::Debug 的实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64298436/

相关文章:

rust - 如何在 Rust 中修复 ".. was mutably borrowed here in the previous iteration of the loop"?

stream - 如何在 Rust 中从 futures::stream::wait::Wait 中提取项目?

macros - 使用宏,如何获得结构字段的唯一名称?

rust - 如何在一个可执行文件中组合不同的算法

oop - 是否可以从特征中访问结构字段?

c++ - 指针重新绑定(bind)的目的是什么?

php - 为什么可以从 PHP 类访问 PHP Trait 的私有(private)成员?

types - 递归实现特征 "Not"

scala - 如何解决 "Implementation restriction: trait ... accesses protected method ... inside a concrete trait method."

rust - 如何忽略 .gitignore 中的 Rust 可执行文件?