Ôn tập: hàm in tổng quát
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 44 trên 61.
Thử thách
DễHãy xây dựng một hệ thống thông báo linh hoạt để minh họa sức mạnh của các ràng buộc trait! Bạn sẽ tạo một trait Printable và một hàm tổng quát có thể thông báo về mọi kiểu triển khai trait này, qua đó cho thấy cách kiểu tổng quát và trait phối hợp với nhau để tạo ra code có thể tái sử dụng và an toàn về kiểu.
Bạn sẽ sắp xếp code trong hai tệp:
printable.rs: Định nghĩa trait công khaiPrintablevới phương thứcprint_info, nhận&selfvà trả vềString. Sau đó, tạo hàm tổng quát công khai tên làannounce, chấp nhận mọi kiểuTtriển khaiPrintable. Hàm này sẽ in raAnnouncement: {info}, trong đó{info}là kết quả gọiprint_info()trên đối tượng.main.rs: Tạo hai struct công khai triển khaiPrintable:Person: có trườngnamecông khai (String). Phương thứcprint_infosẽ trả vềPerson: {name}Product: có các trườngname(String) vàprice(f64) công khai. Phương thứcprint_infosẽ trả vềProduct: {name} - ${price}
announcevới từng đối tượng để chứng minh hàm tổng quát của bạn hoạt động với mọi kiểuPrintable.
Điểm hay của thiết kế này là announce không quan tâm nó nhận được Person, Product hay bất kỳ kiểu nào trong tương lai. Hàm chỉ yêu cầu kiểu đó có thể cung cấp thông tin thông qua print_info(). Ràng buộc trait đảm bảo điều này tại thời điểm biên dịch.
Đầu ra của bạn phải hiển thị cả hai thông báo:
Announcement: Person: {name}
Announcement: Product: {product_name} - ${price}Ví dụ, với các đầu vào Alice, Laptop và 999.99:
Announcement: Person: Alice
Announcement: Product: Laptop - $999.99Bạn sẽ nhận ba đầu vào: tên người, tên sản phẩm và giá sản phẩm (phân tích thành f64).
Tự làm thử
mod printable;
use printable::{Printable, announce};
// TODO: Định nghĩa struct public Person có trường public name (String)
// Triển khai trait Printable cho Person
// print_info cần trả về "Person: {name}"
// TODO: Định nghĩa struct public Product có các trường public name (String) và price (f64)
// Triển khai trait Printable cho Product
// print_info cần trả về "Product: {name} - ${price}"
fn main() {
// Đọc đầu vào
let mut person_name = String::new();
std::io::stdin().read_line(&mut person_name).expect("Failed to read line");
let person_name = person_name.trim().to_string();
let mut product_name = String::new();
std::io::stdin().read_line(&mut product_name).expect("Failed to read line");
let product_name = product_name.trim().to_string();
let mut price_input = String::new();
std::io::stdin().read_line(&mut price_input).expect("Failed to read line");
let price: f64 = price_input.trim().parse().expect("Failed to parse price");
// TODO: Tạo instance Person với person_name
// TODO: Tạo instance Product với product_name và price
// TODO: Gọi announce với Person
// TODO: Gọi announce với Product
}
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 độ8Trait làm ràng buộc
Cú pháp ràng buộc traitNhiều ràng buộcMệnh đề whereTrả về kiểu có traitÔn tập: hàm in tổng quátTự luyện tập: Trình biên dịch Rust online