面试题答案
一键面试1. 设计trait
在Rust中,对象安全的trait需要满足两个条件:
- 所有方法都必须有
Self: Sized
约束或者方法是fn
类型(不依赖self
)。 - 方法的返回类型不能依赖于
Self
的关联类型。
以下是一个简单的图形绘制库的trait设计示例:
// 定义一个对象安全的trait
pub trait Draw {
fn draw(&self);
}
2. 实现代码
以矩形和圆形为例,实现这个trait
:
struct Rectangle {
width: u32,
height: u32,
}
struct Circle {
radius: u32,
}
impl Draw for Rectangle {
fn draw(&self) {
println!("Drawing a rectangle with width {} and height {}", self.width, self.height);
}
}
impl Draw for Circle {
fn draw(&self) {
println!("Drawing a circle with radius {}", self.radius);
}
}
3. 多态绘制
可以使用Box<dyn Draw>
来实现多态绘制:
fn draw_shapes(shapes: &[Box<dyn Draw>]) {
for shape in shapes {
shape.draw();
}
}
4. 解释对象安全
我们设计的Draw
trait是对象安全的,原因如下:
draw
方法使用&self
作为参数,这意味着它不要求Self
是Sized
类型(Self: Sized
约束),符合对象安全的第一个条件。draw
方法的返回类型是()
,不依赖于Self
的关联类型,满足对象安全的第二个条件。
通过这种设计,我们可以使用Box<dyn Draw>
来存储不同类型的图形,并通过调用trait
方法实现多态绘制。