Есть ли способ унаследовать одну черту, чтобы использовать все методы этой черты? - PullRequest
0 голосов
/ 26 декабря 2018

Я прочитал Расширение черт , где в комментарии сказано:

Ржавчина имеет наследование черт, это выглядит так:

pub trait A {}
pub trait B: A {}

Я пытался реализовать этот код Python в Rust:

class Animal(object):
    @classmethod
    def howl(cls):
        print("ao ao")

class Tiger(Animal):
    @classmethod
    def find_food(cls):
        print("find food")

a = Tiger()
a.howl()
a.find_food()

Способ Rust:

lib.rs

pub trait Animal {
    fn howl(&self) {
        println!("ao ao");
    }
}
pub trait Tiger: Animal {
    fn find_food(&self) {
        println!("find food");
    }
}
impl<'a> Animal for &'a str {}
impl<'a> Tiger for &'a str {}

main.rs

extern crate foo;
use foo::Tiger;

fn main() {
    "da".find_food();
    //    "da".howl();
}

Если я хочу использовать howl, я должен импортировать черту Animal, и я не думаю, что это наследование.Есть ли способ унаследовать одну черту, чтобы использовать все методы этой черты?Как организовать код для реализации вышеуказанного кода Python?

1 Ответ

0 голосов
/ 26 декабря 2018

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

Нет.

Действительно, это количество набранных единицкажется незначительной вещью, о которой нужно беспокоиться.Если вас это сильно беспокоит, используйте glob import :

use foo::*;

Некоторые ящики часто имеют концепцию prelude , модуля со всеми общепринятымиимпортированные типы и признаки:

pub mod prelude {
    pub use super::{Animal, Tiger};
}
use foo::prelude::*;

Rust имеет наследуемое свойство

Это сомнительное утверждение.Хотя мы, программисты, ленивы и используем термин «супертрейт», это не наследование, как думают программисты в классических объектно-ориентированных языках программирования.На самом деле, это просто еще один тип ограничения черты:

trait Alpha {}

trait Beta: Alpha {}

// Basically the same as
trait Beta
where
    Self: Alpha,
{}

То есть любой тип, который реализует Beta, должен также реализовывать Alpha.

...