Rust:Trait 详解

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(item: T) {
    item.eat();
   }

这也被称作 trait bond

可以在函数里绑定多个type

//语法糖
fn feed(item1:impl Behavior,item1:impl Behavior) {

//等价写法
fn feed(item1: T, item2: T){

一个type绑定多个trait

fn feed(item: impl Summary + Display) {

//等价
fn feed(item: T) {

你可能感兴趣的:(Rust学习笔记,rust)