面试题答案
一键面试// 定义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());
}
}
代码解释
-
特征定义:
trait Shape
定义了一个名为Shape
的特征。type Measure
定义了一个关联类型Measure
,用于表示不同形状计算结果的类型。fn calculate(&self) -> Self::Measure
定义了一个关联函数calculate
,用于计算形状的度量值,返回类型是关联类型Measure
。
-
Circle结构体及实现:
struct Circle
定义了一个圆的结构体,包含一个radius
字段表示半径。impl Shape for Circle
为Circle
实现Shape
特征。type Measure = f64
明确Circle
的计算结果类型为f64
。calculate
函数根据圆的周长公式2 * π * radius
计算并返回周长。
-
Triangle结构体及实现:
struct Triangle
定义了一个三角形的结构体,包含base
和height
字段分别表示底和高。impl Shape for Triangle
为Triangle
实现Shape
特征。type Measure = f64
明确Triangle
的计算结果类型为f64
。calculate
函数根据三角形面积公式0.5 * base * height
计算并返回面积。
-
多态行为实现:
- 在
main
函数中,创建了Circle
和Triangle
的实例circle
和triangle
。 let shapes: Vec<&dyn Shape> = vec![&circle, &triangle];
创建了一个切片,其中的元素是指向实现了Shape
特征的对象的引用。dyn Shape
是一个特征对象,允许我们以统一的方式处理不同类型但实现了相同特征的对象。- 通过遍历
shapes
切片,调用shape.calculate()
,Rust 的动态调度机制会根据对象的实际类型调用相应的calculate
函数,从而实现多态行为。
- 在