如何拥有实现 2 个特征的 Boxes 向量?

gee*_*ick 7 vector traits rust

在 Rust 中,我想要一个包含实现 2 个特征的项目的 vec。但是,当我尝试像这样实现它时,我收到错误only auto traits can be used as additional traits in a trait object

let mut v : Vec<Box<dyn MyTrait + std::fmt::Display>> = Vec::new();
Run Code Online (Sandbox Code Playgroud)

FairPlay,我完整阅读了错误消息并定义了一个结合了两者的 Trait:

pub trait FormattableDoer: std::fmt::Display + MyTrait{}
Run Code Online (Sandbox Code Playgroud)

它们有一个 Vec of Boxes:

let mut v: Vec<Box<dyn FormattableDoer>> = Vec::new();
Run Code Online (Sandbox Code Playgroud)

然而,编译器似乎无法检测到我的结构已经单独实现了这些东西,并且我收到了错误the trait bound MyStruct: FormattableDoer is not satisfied

我读到过有关使用特征别名的信息,但它不稳定,所以我宁愿不使用它。

这在生锈中可能吗?这似乎是一件很常见的事情,但我很惊讶答案并不简单(或者也许很简单,但我错过了!)。我也在想,也许我处理这个问题的方法完全错误,我正在尝试以“不生锈”的方式做一些事情。如果是这样的话,拥有可显示且具有其他特征的事物向量的首选方式是什么?

带有 MWE 和用例的Playground 。

Sil*_*olo 9

你快到了。你需要一个实现父母双方的标记特征,就像你已经做的那样

pub trait FormattableDoer: std::fmt::Display + MyTrait {}
Run Code Online (Sandbox Code Playgroud)

然后,您需要一个全面的实现,将这两个特征应用到您的新特征中。

impl<T: std::fmt::Display + MyTrait> FormattableDoer for T {}
Run Code Online (Sandbox Code Playgroud)

现在,所有实现std::fmt::Display MyTraitFormattableDoer自动实现的内容,并且由于FormattableDoer是单个特征,因此它可以用作特征对象。

Box<dyn FormattableDoer>然后就像您已经尝试过的那样使用。