图形面积计算器
本课属于 Coddy Rust 学习旅程的“面向对象编程”单元。第 61 课,共 61 课。
挑战
简单这个最终挑战会综合运用 trait、trait 对象和多态来解决一个实际问题:计算存储在同一个集合中的不同形状的总面积。
让我们构建一个形状面积计算器,展示 trait 对象和多态的强大之处!你将创建一个系统,让不同的形状,也就是圆形和正方形,可以存储在同一个集合中,并通过统一的接口计算它们的总面积。
你将把代码分布在三个文件中:
shape.rs:定义Shapetrait,其中包含一个返回f64的area方法。这个 trait 规定了所有形状都必须遵守的约定。shapes.rs:创建两个实现该 trait 的结构体。Circle有一个radius(f64),Square有一个side(f64)。每个结构体都应通过对应的面积公式实现Shapetrait。对于圆形,使用3.14159作为 π。main.rs:引入两个模块,并创建一个total_area函数。该函数接收Vec<Box<dyn Shape>>,并返回所有面积的总和。使用给定的输入创建一个圆形和一个正方形,将它们存储在一个 trait 对象向量中,计算总面积并打印结果。
面积公式如下:
- 圆形:
3.14159 × radius × radius - 正方形:
side × side
输出应显示所有形状的总面积:
Total area: {total}例如,输入 2.0(圆形半径)和 3.0(正方形边长)时:
Total area: 21.56636这是因为:圆形面积 = 3.14159 × 2² = 12.56636,正方形面积 = 3² = 9,总面积 = 21.56636
输入 1.0 和 4.0 时:
Total area: 19.14159你将收到两个输入:圆形的半径和正方形的边长(都解析为 f64)。
亲手试试
mod shape;
mod shapes;
use shape::Shape;
use shapes::{Circle, Square};
// TODO: 实现 total_area 函数
// 该函数应接收一个 Vec<Box<dyn Shape>>,并以 f64 类型返回所有面积的总和
fn total_area(shapes: Vec<Box<dyn Shape>>) -> f64 {
// TODO: 计算并返回所有形状的面积之和
0.0
}
fn main() {
let mut input1 = String::new();
std::io::stdin().read_line(&mut input1).expect("Failed to read line");
let radius: f64 = input1.trim().parse().expect("Invalid number");
let mut input2 = String::new();
std::io::stdin().read_line(&mut input2).expect("Failed to read line");
let side: f64 = input2.trim().parse().expect("Invalid number");
// TODO: 用给定的半径创建一个 Circle
// TODO: 用给定的边长创建一个 Square
// TODO: 将这两个形状存入一个 Vec<Box<dyn Shape>>
// TODO: 调用 total_area,并按以下格式打印结果:"Total area: {total}"
}
面向对象编程中的所有课
自己练习: Rust 在线编译器