MST
星途 面试题库

面试题:Rust类型转换中的trait对象及动态分发

在Rust中,定义两个结构体 `Animal` 和 `Dog`,`Dog` 继承自 `Animal`。创建一个 `Vec<Box<dyn AnimalTrait>>`,其中 `AnimalTrait` 是 `Animal` 和 `Dog` 都实现的trait。实现一个函数,该函数接收这个 `Vec`,并在遍历 `Vec` 时,对每个元素进行合适的类型转换(如果是 `Dog` 类型,调用其特有的方法),同时处理好类型转换失败的情况,用代码展示如何实现。
46.3万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
trait AnimalTrait {
    fn speak(&self);
}

struct Animal;

impl AnimalTrait for Animal {
    fn speak(&self) {
        println!("I'm an animal.");
    }
}

struct Dog;

impl AnimalTrait for Dog {
    fn speak(&self) {
        println!("I'm a dog, woof!");
    }

    fn bark(&self) {
        println!("Woof woof!");
    }
}

fn process_animals(animals: Vec<Box<dyn AnimalTrait>>) {
    for animal in animals {
        if let Some(dog) = animal.downcast_ref::<Dog>() {
            dog.bark();
        } else {
            animal.speak();
        }
    }
}

fn main() {
    let mut animals: Vec<Box<dyn AnimalTrait>> = Vec::new();
    animals.push(Box::new(Animal));
    animals.push(Box::new(Dog));

    process_animals(animals);
}