有没有一种方法可以继承一个特征以使用该特征的所有方法?

时间:2018-12-26 03:20:48

标签: rust traits

我已经读过Extending Traits,其中的注释是:

  

锈具有特征继承,看起来像这样:

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

我试图在Rust中实现此Python代码:

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

铁锈方式:

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 :(得分:3)

  

是否有一种方法可以导入一个特征以使用该特征及其子特征的所有方法?

否。

真的,打字的数量似乎是一件令人担心的小事情。如果让您感到困扰,请使用全局导入

use foo::*;

某些板条箱通常具有 prelude 的概念,该模块具有所有通常导入的类型和特征:

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

铁锈具有性状遗传

这是一个可疑的陈述。尽管我们的程序员很懒惰,并使用“超级特质”一词,但它并不是传统面向对象编程语言中的程序员所想到的继承。真的,这只是特质绑定的另一种类型:

trait Alpha {}

trait Beta: Alpha {}

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

也就是说,任何实现Beta的类型也必须实现Alpha