MST

星途 面试题库

面试题:Rust 关联函数与关联类型的复杂场景运用

有一个特征 `Shape`,包含关联类型 `Measure` 和关联函数 `calculate` 用于计算形状的某个度量值。定义两个结构体 `Circle` 和 `Triangle` 都实现 `Shape` 特征。`Circle` 的 `calculate` 函数计算圆的周长,`Triangle` 的 `calculate` 函数计算三角形的面积。请详细写出相关代码,并解释如何在使用这两个结构体时,利用 `Shape` 特征的关联类型和关联函数实现多态行为。
45.8万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
// 定义Shape特征
trait Shape {
    type Measure;
    fn calculate(&self) -> Self::Measure;
}

// 定义Circle结构体
struct Circle {
    radius: f64,
}

// Circle实现Shape特征
impl Shape for Circle {
    type Measure = f64;
    fn calculate(&self) -> Self::Measure {
        2.0 * std::f64::consts::PI * self.radius
    }
}

// 定义Triangle结构体
struct Triangle {
    base: f64,
    height: f64,
}

// Triangle实现Shape特征
impl Shape for Triangle {
    type Measure = f64;
    fn calculate(&self) -> Self::Measure {
        0.5 * self.base * self.height
    }
}

fn main() {
    let circle = Circle { radius: 5.0 };
    let triangle = Triangle { base: 4.0, height: 3.0 };

    let shapes: Vec<&dyn Shape> = vec![&circle, &triangle];

    for shape in shapes {
        println!("Calculated value: {}", shape.calculate());
    }
}

代码解释

  1. 特征定义

    • trait Shape 定义了一个名为 Shape 的特征。
    • type Measure 定义了一个关联类型 Measure,用于表示不同形状计算结果的类型。
    • fn calculate(&self) -> Self::Measure 定义了一个关联函数 calculate,用于计算形状的度量值,返回类型是关联类型 Measure
  2. Circle结构体及实现

    • struct Circle 定义了一个圆的结构体,包含一个 radius 字段表示半径。
    • impl Shape for CircleCircle 实现 Shape 特征。
    • type Measure = f64 明确 Circle 的计算结果类型为 f64
    • calculate 函数根据圆的周长公式 2 * π * radius 计算并返回周长。
  3. Triangle结构体及实现

    • struct Triangle 定义了一个三角形的结构体,包含 baseheight 字段分别表示底和高。
    • impl Shape for TriangleTriangle 实现 Shape 特征。
    • type Measure = f64 明确 Triangle 的计算结果类型为 f64
    • calculate 函数根据三角形面积公式 0.5 * base * height 计算并返回面积。
  4. 多态行为实现

    • main 函数中,创建了 CircleTriangle 的实例 circletriangle
    • let shapes: Vec<&dyn Shape> = vec![&circle, &triangle]; 创建了一个切片,其中的元素是指向实现了 Shape 特征的对象的引用。dyn Shape 是一个特征对象,允许我们以统一的方式处理不同类型但实现了相同特征的对象。
    • 通过遍历 shapes 切片,调用 shape.calculate(),Rust 的动态调度机制会根据对象的实际类型调用相应的 calculate 函数,从而实现多态行为。