根据 Rust 文档:
All traits except the first trait must be auto traits
这个问题源自我在写项目时,我希望我的函数最终能输入一个类型的值,它既能 A 又能 B。那很自然的,我以为是可以使用 Box<dyn A + B>
的形式来定义的,然而编译器不允许这样的操作。具体的代码如下:
trait Actionable {
fn run() -> String {
String::from("hello world")
}
}
fn some_func() -> Box<dyn Actionable + Display> {
...
}
这时编译器会报 Display 不是 Auto Trait 的错误,我能做的,就是将 Display
设为 Actionable
的 supertrait:
trait Actionable :Display {
fn run() -> String {
String::from("hello world")
}
}
fn some_func() -> Box<dyn Actionable> {
...
}
但这样做还是达不到我想要的效果,因为我只能通过 "继承" 来实现类型的组合,而不是通过直接组合类型来达成一个新的限制。
1
共 1 条评论, 1 页
评论区
写评论rust目前不支持在trait object里直接两个trait相加,参见
rustc --explain E0225
,以及你提到的那个文档中也只提到了只能加上Sync等特殊的Trait。如果必须要组合你可以尝试声明一个新Trait,比如
trait BothActionableAndDisplay: Actionable + Display {}
,这个就可以做Trait Object了(但是你的Actionable需要改,参见编译器报错)。