Rust 静态分发和动态分发

发布时间 2023-09-24 18:05:21作者: liuzonglin

首先定义两个结构体 Dog 和 Cat 分别实现 Animal trait

trait Animal {
    fn speak(&self);
}
struct Dog;
impl Animal for Dog {
    fn speak(&self) {
        println!("旺旺.....");
    }
}
struct Cat;
impl Animal for Cat {
    fn speak(&self) {
        println!("喵喵.....");
    }
}

通过泛型实现静态分发

fn animal_speak<T: Animal>(animal: T) {
    animal.speak();
}

fn main() {
    let dog = Dog;
    let cat = Cat;

    animal_speak(dog);
    animal_speak(cat);
}

// 输出:
// 旺旺.....
// 喵喵.....

这样相当于为每个Dog和Cat分别实现了一个animal_speak()方法

fn dog_speak(dog: dog) {
    dog.speak();
}

fn cat_speak(cat: Cat) {
    cat.speak();
}

目前只能看出来静态分发会导致编译后的二进制文件膨胀,至于好处还要和动态分发对比才能知道;

通过&或者Box智能指针来实现动态分发

fn animal_speak(animal: &dyn Animal) {
    animal.speak();
}

fn main() {
    let dog = Dog;
    let cat = Cat;

    animal_speak(&dog);
    animal_speak(&cat);
}

// 输出:
// 旺旺.....
// 喵喵.....

探索Rust中的动态分派