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 。
你快到了。你需要一个实现父母双方的标记特征,就像你已经做的那样
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 和 MyTrait将FormattableDoer自动实现的内容,并且由于FormattableDoer是单个特征,因此它可以用作特征对象。
Box<dyn FormattableDoer>然后就像您已经尝试过的那样使用。
| 归档时间: |
|
| 查看次数: |
1012 次 |
| 最近记录: |