我刚开始生锈,但遇到以下问题:我想拥有一个称为Artifact
的特征,而Artifact
的定义是它可以包含多个{{1} }。
我的第一个想法是制作一个包含Artifact
特征向量的Artifact
特征:
Artifact
我遇到以下错误:
trait Artifact
{
type artifacts = Vec<Box<dyn Artifact>>;
}
有没有办法进行这种设计?
答案 0 :(得分:1)
如果将特征中的类型定义定义为dyn trait
,则它是关联的类型,您需要在该特征的实现中指定该类型。
有没有办法进行这种设计?
在当前的稳定版本中,不支持默认关联类型。但是您可以通过每晚发行频道来实现所需的目标,如下所示:
#![feature(associated_type_defaults)]
trait Artifact {
type artifacts = Vec<Box<dyn Artifact<artifacts = Self>>>;
}
在稳定发布频道中,您可以实施最接近的想法,如下所示:
trait Artifact {
fn artifact_call(&self);
}
struct Artifact1 {
inners: Vec<Box<dyn Artifact>>,
}
struct Artifact2;
struct Artifact3;
impl Artifact for Artifact1 {
fn artifact_call(&self) {
self.inners
.iter()
.for_each(|artifact| artifact.artifact_call());
}
}
impl Artifact for Artifact2 {
fn artifact_call(&self) {
println!("Artifact 2 Call");
}
}
impl Artifact for Artifact3 {
fn artifact_call(&self) {
println!("Artifact 3 Call");
}
}
fn main() {
let container_artifact = Artifact1 {
inners: vec![Box::new(Artifact2), Box::new(Artifact3)],
};
container_artifact.artifact_call();
}