有没有办法使包含自身向量的特征?

时间:2019-05-28 04:23:14

标签: rust

我刚开始生锈,但遇到以下问题:我想拥有一个称为Artifact的特征,而Artifact的定义是它可以包含多个{{1} }。

我的第一个想法是制作一个包含Artifact特征向量的Artifact特征:

Artifact

我遇到以下错误:

trait Artifact
{
    type artifacts = Vec<Box<dyn Artifact>>;
}

有没有办法进行这种设计?

1 个答案:

答案 0 :(得分:1)

如果将特征中的类型定义定义为dyn trait,则它是关联的类型,您需要在该特征的实现中指定该类型。

  

有没有办法进行这种设计?

在当前的稳定版本中,不支持默认关联类型。但是您可以通过每晚发行频道来实现所需的目标,如下所示:

#![feature(associated_type_defaults)]
trait Artifact {
    type artifacts = Vec<Box<dyn Artifact<artifacts = Self>>>;
}

Playground


稳定发布频道中,您可以实施最接近的想法,如下所示:

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();
}

Playground