Menu
CoddyTech

Ô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.

challenge icon

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 khai Printable với phương thức print_info, nhận &self và 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ểu T triển khai Printable. Hàm này sẽ in ra Announcement: {info}, trong đó {info} là kết quả gọi print_info() trên đối tượng.
  • main.rs: Tạo hai struct công khai triển khai Printable:
    • Person: có trường name công khai (String). Phương thức print_info sẽ trả về Person: {name}
    • Product: có các trường name (String) và price (f64) công khai. Phương thức print_info sẽ trả về Product: {name} - ${price}
    Đưa module printable vào, dùng các đầu vào để tạo một Person và một Product, sau đó gọi announce vớ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ểu Printable.

Đ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.99

Bạ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

Tự luyện tập: Trình biên dịch Rust online