< 返回版块

DingDean 发表于 2020-07-31 16:45

Tags:trait

根据 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> {
    ...
}

但这样做还是达不到我想要的效果,因为我只能通过 "继承" 来实现类型的组合,而不是通过直接组合类型来达成一个新的限制。

评论区

写评论
xjkdev 2020-07-31 20:42

rust目前不支持在trait object里直接两个trait相加,参见rustc --explain E0225,以及你提到的那个文档中也只提到了只能加上Sync等特殊的Trait。

如果必须要组合你可以尝试声明一个新Trait,比如trait BothActionableAndDisplay: Actionable + Display {},这个就可以做Trait Object了(但是你的Actionable需要改,参见编译器报错)。

1 共 1 条评论, 1 页