面试题答案
一键面试- Trait 定义:
在 Rust 中,首先定义一个
Draw
trait,它包含一个draw
方法。trait Draw { fn draw(&self); }
- 结构体实现 Trait:
定义
Circle
和Rectangle
结构体,并为它们实现Draw
trait。struct Circle { radius: f64, } impl Draw for Circle { fn draw(&self) { println!("Drawing a circle with radius {}", self.radius); } } struct Rectangle { width: f64, height: f64, } impl Draw for Rectangle { fn draw(&self) { println!("Drawing a rectangle with width {} and height {}", self.width, self.height); } }
- 动态分发体现灵活性示例:
可以创建一个
Vec<Box<dyn Draw>>
类型的向量,它可以存储任何实现了Draw
trait 的类型的实例(通过装箱,将具体类型变成 trait 对象)。这样就可以在运行时根据实际存储的对象类型来调用相应的draw
方法,这就是动态分发的体现。
在上述代码中,fn main() { let mut shapes: Vec<Box<dyn Draw>> = Vec::new(); shapes.push(Box::new(Circle { radius: 5.0 })); shapes.push(Box::new(Rectangle { width: 10.0, height: 5.0 })); for shape in &shapes { shape.draw(); } }
shapes
向量可以存储不同类型的图形(Circle
和Rectangle
),在遍历这个向量调用draw
方法时,会根据实际的对象类型(Circle
或Rectangle
)来调用对应的draw
实现,展示了动态分发的灵活性。这种灵活性使得代码可以在运行时根据实际情况决定调用哪个具体类型的方法,而不需要在编译时就确定所有可能的类型,在处理复杂的对象层次结构或未知类型的对象集合时非常有用。