面试题答案
一键面试在Rust中,通过将具体类型转换为trait对象,可以实现类型擦除。trait对象是一种指针类型(&dyn Trait
或Box<dyn Trait>
),它允许我们在运行时动态地确定对象的具体类型,而无需在编译时就知道其确切类型。
下面是一个简单的示例代码,展示了如何定义一个包含不同类型但实现了同一trait的对象集合:
// 定义一个trait
trait Animal {
fn speak(&self);
}
// 定义一个实现Animal trait的Dog结构体
struct Dog {
name: String,
}
impl Animal for Dog {
fn speak(&self) {
println!("Woof! My name is {}", self.name);
}
}
// 定义一个实现Animal trait的Cat结构体
struct Cat {
name: String,
}
impl Animal for Cat {
fn speak(&self) {
println!("Meow! My name is {}", self.name);
}
}
fn main() {
// 创建一个包含不同类型但实现了Animal trait的对象集合
let animals: Vec<Box<dyn Animal>> = vec![
Box::new(Dog { name: "Buddy".to_string() }),
Box::new(Cat { name: "Whiskers".to_string() }),
];
// 遍历集合并调用speak方法
for animal in animals {
animal.speak();
}
}
在这个示例中:
- 定义了一个
Animal
trait,它有一个speak
方法。 - 定义了
Dog
和Cat
两个结构体,并为它们实现了Animal
trait。 - 在
main
函数中,创建了一个Vec<Box<dyn Animal>>
类型的集合,其中包含了Dog
和Cat
的实例,通过Box::new
将它们转换为trait对象。 - 遍历这个集合,调用每个对象的
speak
方法,实现了多态行为。由于使用了trait对象,编译器不需要在编译时知道集合中具体对象的类型,从而实现了类型擦除。