Rust语言里不同的type(比如 struct, enum等)可以调用的函数主要包括本身实现的方法。此外,Rust也提供了trait来定义不同type所需的“common behavior”,以此简化代码。
1. 基本内容
定义trait:
一个trait里面可以包含多个method
trait Behavior {
fn eat(&self){
println!("真香")
}
fn make_sound(&self);
}
对type实现trait:
以strcut为例,对struct实现trait,方式与实现struct方法类似。实现时可以选择 重写trait中的method,也可以选择不重写,直接使用trait中默认的method定义
struct Dog;
impl Behavior for Dog {
fn make_sound(&self) {
println!("汪!")
}
}
struct Cat;
impl Behavior for Cat {
fn make_sound(&self) {
println!("喵~")
}
}
结果:
实例化struct,调用trait
fn main(){
let dog = Dog;
let cat = Cat;
dog.eat();
dog.make_sound();
cat.eat();
cat.make_sound();
}
真香
汪!
真香
喵~
2. 一些高级玩法
把trait作为参数传给函数,让函数可以处理不同的type
fn feed(item: impl Behavior) {
item.eat();
}
feed(item:dog);
真香
不过,feed(item:impl Behavior)是简略写法,是种语法糖。完整的形式是:
fn feed<T: Behavior>(item: T) {
item.eat();
}
这也被称作 trait bond。
可以在函数里绑定多个type
//语法糖
fn feed(item1:impl Behavior,item1:impl Behavior) {
//等价写法
fn feed<T: Behavior>(item1: T, item2: T){
一个type绑定多个trait
fn feed(item: impl Summary + Display) {
//等价
fn feed<T: Summary + Display>(item: T) {