6.1 特质和泛型(Trait && generics)
Traits
- 与接口和抽象类类似
- 给结构体添加定义的行为
impl trait_demo for struct_demo
struct Steve {
name: String,
}
impl Person for Steve {
fn new(name_str: String) -> Self {
Steve {
name: name_str }
}
fn language(&self) -> &str {
"Steve"
}
}
struct Alex {
name: String,
}
impl Person for Alex {
fn new(name_str: String) -> Self {
Alex {
name: name_str }
}
fn language(&self) -> &str {
"Alex"
}
fn eat_food(&self) {
println!("Eat fish!");
}
}
trait Person {
fn new(name_str: String) -> Self;
fn language(&self) -> &str;
fn eat_food(&self) {
println!("Eat food");
}
}
fn main() {
let a = Steve::new("Star_tears".to_string());
let b = Alex::new("T_dream".to_string());
a.eat_food();
b.eat_food();
}
-
返回枚举
-
fn get_trait -> Box<dyn trait_name>
-
泛型
- 泛型程序设计(
generic programming
)是程序设计语言的一种风格或范式 - 泛型运行程序员在强类型程序设计语言中编写代码时使用一些以后才指定的类型,在实例化时作为参数指明这些类型
trait Bark {
fn bark(&self) -> String;
}
struct Dog {
species: String,
}
struct Cat {
color: String,
}
impl Bark for Dog {
fn bark(&self) -> String {
format!("{} barking", self.species)
}
}
fn bark<T: Bark>(b: T) {
println!("{}", b.bark());
}
fn main() {
let dog = Dog {
species: "white dog".to_string(),
};
bark(dog);
}