Danh mục thư viện
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 60 trên 61.
Thử thách
DễHãy xây dựng một hệ thống danh mục thư viện để minh họa cách trait hợp nhất các kiểu khác nhau dưới một giao diện chung! Bạn sẽ tạo một danh mục trong đó sách và tạp chí, dù có các thuộc tính khác nhau, đều có thể tự mô tả thông qua một trait dùng chung.
Bạn sẽ sắp xếp code trong ba tệp:
catalog.rs: Định nghĩa traitCatalogItemvới một phương thức duy nhất làdescription, trả về mộtString. Trait này đặt ra hợp đồng mà mọi tài liệu thư viện phải tuân theo.items.rs: Tạo hai struct triển khai trait của bạn.Bookcótitlevàauthor(đều là chuỗi), cònMagazinecóname(chuỗi) và sốissue(u32). Mỗi struct cần triển khaiCatalogItemvới định dạng mô tả riêng.main.rs: Đưa cả hai module vào và tạo các instance của Book và Magazine bằng những đầu vào đã cho. Gọi phương thứcdescriptiontrên từng mục và in ra kết quả.
Mô tả của Book cần theo định dạng này:
Book: {title} by {author}Mô tả của Magazine cần theo định dạng này:
Magazine: {name}, Issue {issue}Ví dụ, với các đầu vào 1984, George Orwell, Nature và 42:
Book: 1984 by George Orwell
Magazine: Nature, Issue 42Và với các đầu vào The Rust Book, Steve Klabnik, Science Weekly và 156:
Book: The Rust Book by Steve Klabnik
Magazine: Science Weekly, Issue 156Bạn sẽ nhận bốn đầu vào: tiêu đề sách, tác giả sách, tên tạp chí và số ấn bản của tạp chí (hãy phân tích giá trị cuối cùng thành u32).
Tự làm thử
mod catalog;
mod items;
use catalog::CatalogItem;
use items::{Book, Magazine};
fn main() {
// Đọc các đầu vào
let mut book_title = String::new();
std::io::stdin().read_line(&mut book_title).expect("Failed to read line");
let book_title = book_title.trim().to_string();
let mut book_author = String::new();
std::io::stdin().read_line(&mut book_author).expect("Failed to read line");
let book_author = book_author.trim().to_string();
let mut magazine_name = String::new();
std::io::stdin().read_line(&mut magazine_name).expect("Failed to read line");
let magazine_name = magazine_name.trim().to_string();
let mut issue_input = String::new();
std::io::stdin().read_line(&mut issue_input).expect("Failed to read line");
let magazine_issue: u32 = issue_input.trim().parse().expect("Failed to parse issue number");
// TODO: Tạo một instance Book bằng book_title và book_author
// TODO: Tạo một instance Magazine bằng magazine_name và magazine_issue
// TODO: Gọi description() cho từng mục và in kết quả ra
}
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