面试题答案
一键面试特质对象
特质对象(trait object)是 Rust 中一种特殊的对象类型,它允许在运行时根据对象的实际类型来决定调用哪个方法。特质对象通过指针(通常是 &dyn Trait
或 Box<dyn Trait>
)来实现,其中 dyn
关键字表示这是一个特质对象。特质对象只能用于特质,而不能用于具体类型。
动态分发机制
动态分发是一种在运行时根据对象的实际类型来决定调用哪个方法的机制。在 Rust 中,特质对象通过胖指针(fat pointer)来实现动态分发。胖指针包含两个部分:一个指向数据的指针和一个指向虚表(vtable)的指针。虚表是一个包含了特质方法地址的表,当通过特质对象调用方法时,Rust 会根据虚表中的地址来找到实际要调用的方法。
代码示例
// 定义一个特质
trait Animal {
fn speak(&self);
}
// 定义两个结构体,分别实现 Animal 特质
struct Dog;
impl Animal for Dog {
fn speak(&self) {
println!("Woof!");
}
}
struct Cat;
impl Animal for Cat {
fn speak(&self) {
println!("Meow!");
}
}
fn main() {
// 创建特质对象的向量
let animals: Vec<Box<dyn Animal>> = vec![
Box::new(Dog),
Box::new(Cat),
];
// 遍历向量并调用 speak 方法,这里发生了动态分发
for animal in animals {
animal.speak();
}
}
在这个示例中,我们定义了 Animal
特质,并让 Dog
和 Cat
结构体实现了这个特质。然后,我们创建了一个包含 Box<dyn Animal>
类型的向量,并在遍历向量时调用 speak
方法。由于使用了特质对象,Rust 会在运行时根据对象的实际类型(Dog
或 Cat
)来决定调用哪个 speak
方法,从而实现了运行时多态。