MST

星途 面试题库

面试题:Rust函数指针作为参数传递在复杂场景中的应用

假设你正在开发一个图形渲染库,有一个结构体 `Shape` 表示不同的图形(如圆形、矩形等),每个图形都有自己的渲染函数。请设计一个Rust函数 `render_scene`,它接受一个 `Shape` 类型的切片和一个函数指针作为参数,函数指针用于根据不同的 `Shape` 调用相应的渲染函数。请详细实现 `Shape` 结构体、各个图形的渲染函数以及 `render_scene` 函数,并阐述这种设计在代码可扩展性和维护性方面的优势。
45.4万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
// Shape结构体定义
trait Shape {
    fn render(&self);
}

// 圆形结构体
struct Circle {
    radius: f64,
}

impl Shape for Circle {
    fn render(&self) {
        println!("Rendering a circle with radius: {}", self.radius);
    }
}

// 矩形结构体
struct Rectangle {
    width: f64,
    height: f64,
}

impl Shape for Rectangle {
    fn render(&self) {
        println!("Rendering a rectangle with width: {} and height: {}", self.width, self.height);
    }
}

// render_scene函数
fn render_scene(shapes: &[&dyn Shape]) {
    for shape in shapes {
        shape.render();
    }
}

可扩展性优势

  1. 新增图形容易:如果要新增一种图形,比如三角形,只需要定义一个 Triangle 结构体,并实现 Shape trait 中的 render 方法即可。无需修改现有的 render_scene 函数和其他图形的实现代码。
  2. 易于添加新功能:可以在 Shape trait 中添加新的方法,所有实现了该 trait 的图形结构体都会自动拥有这个新功能。

维护性优势

  1. 单一职责:每个图形的渲染逻辑都封装在自己的结构体和对应的 render 实现中,使得代码的职责清晰,易于理解和修改。
  2. 代码复用render_scene 函数不关心具体的图形类型,只需要知道这些图形都实现了 Shape trait,从而实现了对不同图形渲染的统一处理,减少了重复代码。