Ôn tập: enum Shape
Thuộc phần Lập trình hướng đối tượng trong hành trình Rust của Coddy. Bài học 18 trên 61.
Thử thách
DễHãy xây dựng một máy tính hình học dùng enum để biểu diễn các hình khác nhau, mỗi hình lưu các kích thước riêng. Enum Shape sẽ cho bạn thấy một kiểu có thể chứa các cấu trúc dữ liệu khác nhau và cung cấp hành vi thống nhất thông qua các phương thức.
Bạn sẽ tạo hai tệp để sắp xếp code:
shape.rs: Định nghĩa enumShapecông khai với hai biến thể:Circle: chứa một giá trịf64biểu thị bán kính (cú pháp tuple)Rectangle: chứa các trường có tên:width(f64) vàheight(f64)
areadùng cách khớp mẫu (pattern matching) để tính diện tích phù hợp với từng biến thể. Với hình tròn, dùng3.14159làm giá trị π.main.rs: Đưa module hình học vào, tạo một đối tượng cho mỗi biến thể hình bằng các đầu vào đã cho, rồi in diện tích của từng hình.
Phương thức area cần trả về một giá trị f64. Khi khớp, hãy phân rã từng biến thể để lấy các kích thước rồi áp dụng công thức phù hợp:
- Diện tích hình tròn:
π × radius² - Diện tích hình chữ nhật:
width × height
Đầu ra cần hiển thị diện tích của mỗi hình trên một dòng riêng, với chính xác một chữ số thập phân:
Circle area: {area}
Rectangle area: {area}Ví dụ, với hình tròn có bán kính 5.0 và hình chữ nhật có chiều rộng 4.0, chiều cao 6.0, đầu ra sẽ là:
Circle area: 78.5
Rectangle area: 24.0Bạn sẽ nhận ba đầu vào: bán kính hình tròn, chiều rộng hình chữ nhật và chiều cao hình chữ nhật.
Tự làm thử
mod shape;
use shape::Shape;
fn main() {
// Đọc các giá trị đầu vào
let mut radius_input = String::new();
std::io::stdin().read_line(&mut radius_input).expect("Failed to read line");
let radius: f64 = radius_input.trim().parse().expect("Invalid number");
let mut width_input = String::new();
std::io::stdin().read_line(&mut width_input).expect("Failed to read line");
let width: f64 = width_input.trim().parse().expect("Invalid number");
let mut height_input = String::new();
std::io::stdin().read_line(&mut height_input).expect("Failed to read line");
let height: f64 = height_input.trim().parse().expect("Invalid number");
// TODO: Tạo hình Circle bằng bán kính
// TODO: Tạo hình Rectangle bằng chiều rộng và chiều cao
// TODO: In ra diện tích của mỗi hình với một chữ số thập phân
// Định dạng: "Circle area: {area}" và "Rectangle area: {area}"
}
Tất cả bài học trong Lập trình hướng đối tượng
1Phương thức và hành vi
Nhập môn khối triển khaiTham số selfPhương thức có thể thay đổiHàm liên kếtNhiều khối triển khaiNối chuỗi phương thứcÔn tập: thao tác với hình chữ nhật4Dự án: Thú cưng ảo
Định nghĩa thú cưngCho thú cưng ăn7Các trait tiêu chuẩn
Trait DebugTrait DisplayClone và CopyCác trait so sánh bằngÔn tập: Điểm có thể in ra2Tính đóng gói và module
Kiến thức cơ bản về moduleTừ khóa publicTrường riêng tưHàm lấy giá trịHàm thiết lập giá trịÔn tập: tủ khóa an toàn5Kiểu tổng quát
Cấu trúc tổng quátPhương thức tổng quátNhiều kiểu tổng quátHàm tổng quátÔn tập: điểm tọa độTự luyện tập: Trình biên dịch Rust online