Как объект черты Rust может вернуть другой объект черты? - PullRequest
1 голос
/ 10 февраля 2020

Как я могу попробовать что-то подобное в Rust?

Класс builder - это объект trait, который возвращает другой объект trait (стирание типа), где выбранная реализация определяется спецификацией c объект черты строителя, который мы используем.

trait Builder {
    // I want this trait to return a trait object
    fn commits(&self) -> dyn Commit;

    fn finish(&self);
}

trait Commit {
}

struct FooBuilder {
}

struct FooCommit {
}

impl Builder for FooBuilder {
    fn commits(&self) -> impl Commit {
        FooCommit{ }
    }

    fn finish(&self) {
    }
}

fn get_commits(b: &Builder) {
    // trait object returns a trait
    let c = b.commits();
}

fn main() {
    let b = FooBuilder{};
    get_commits(&b);
    b.finish();
}

1 Ответ

1 голос
/ 10 февраля 2020

Нет проблем с возвратом объектов свойств из методов свойств в Rust:

trait Foo {
  fn bar(&self) -> Box<dyn Bar>;
}

Следует отметить, что вам нужно возвращать Box<dyn Bar>, а не dyn Bar, поскольку размер dyn Bar неизвестно во время компиляции, что делает его бесполезным.

Когда вы реализуете эту черту, подпись должна совпадать, поэтому она должна возвращать Box<dyn Bar>, а не impl Bar:

impl Foo for MyFoo {
  fn bar(&self) -> Box<dyn Bar> {
    Box::new(MyBar{})
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...