Есть ли способ создать черту, содержащую сам вектор? - PullRequest
1 голос
/ 28 мая 2019

Я совсем новичок в ржавчине, и у меня есть следующие проблемы: я хочу иметь черту, которую я называю Artifact, и определение Artifact состоит в том, что он может содержать кратные Artifact.

Моей первой идеей было создать черту Artifact, содержащую вектор черты Artifact:

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

Я получил следующую ошибку:

error[E0191]: the value of the associated type `artifacts` (from the trait `Artifact::Artifact`) must be specified
 --> src/Artifact.rs:4:30
  |
4 |     type artifacts = Vec<Box<dyn Artifact>>;
  |     -------------------------^^^^^^^^^^^^---
  |     |                        |
  |     |                        associated type `artifacts` must be specified
  |     `artifacts` defined here

Есть липуть в ржавчине, чтобы сделать такой дизайн?

1 Ответ

1 голос
/ 28 мая 2019

Если вы определяете определение типа в признаке как 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();
}

Детская площадка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...