MST

星途 面试题库

面试题:Rust枚举、trait对象及动态分发的深度应用

定义一个`trait` `Drawable`,包含`draw`方法。接着定义一个枚举`Shape`,其变体包括`Circle(f64)`(表示半径)、`Rectangle(f64, f64)`(表示宽和高)。在`Shape`枚举上实现`Drawable` trait,`draw`方法根据不同形状打印相应的绘制信息。然后编写一个函数`draw_shapes`,该函数接受一个`Vec<Box<dyn Drawable>>`参数,在函数内遍历该向量并调用每个对象的`draw`方法。最后在`main`函数中创建不同形状的实例,放入向量并调用`draw_shapes`函数。要求考虑内存管理和动态分发的性能优化。
11.9万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
trait Drawable {
    fn draw(&self);
}

enum Shape {
    Circle(f64),
    Rectangle(f64, f64),
}

impl Drawable for Shape {
    fn draw(&self) {
        match self {
            Shape::Circle(radius) => println!("Drawing a circle with radius {radius}"),
            Shape::Rectangle(width, height) => println!("Drawing a rectangle with width {width} and height {height}"),
        }
    }
}

fn draw_shapes(shapes: &Vec<Box<dyn Drawable>>) {
    for shape in shapes {
        shape.draw();
    }
}

fn main() {
    let mut shapes: Vec<Box<dyn Drawable>> = Vec::new();
    shapes.push(Box::new(Shape::Circle(5.0)));
    shapes.push(Box::new(Shape::Rectangle(10.0, 5.0)));

    draw_shapes(&shapes);
}

说明

  1. 定义trait Drawable:包含draw方法,这是所有可绘制对象需要实现的方法。
  2. 定义枚举Shape:包含CircleRectangle两种变体,分别携带半径、宽和高的信息。
  3. Shape上实现Drawable traitdraw方法通过match语句根据不同的形状变体打印相应的绘制信息。
  4. 定义draw_shapes函数:接受一个Vec<Box<dyn Drawable>>参数,遍历向量并调用每个对象的draw方法。这里使用&Vec<Box<dyn Drawable>>避免所有权转移,提高性能。
  5. main函数中:创建不同形状的实例并放入向量,调用draw_shapes函数进行绘制。使用Box<dyn Drawable>实现动态分发,并且在draw_shapes函数参数中使用引用,减少不必要的内存拷贝,优化内存管理和动态分发性能。