Menu
CoddyTech

总结:泛型打印器

本课属于 Coddy Rust 学习旅程的“面向对象编程”单元。第 44 课,共 61 课。

challenge icon

挑战

简单

让我们构建一个灵活的公告系统,展示 trait 限定的强大之处!你将创建一个 Printable trait 和一个泛型函数,它可以公告任何实现了这个 trait 的类型,展示泛型和 trait 如何协同工作,从而创建可复用且类型安全的代码。

你将把代码分到两个文件中:

  • printable.rs:定义一个公共的 Printable trait,其中包含一个 print_info 方法,该方法接收 &self 并返回一个 String。然后创建一个名为 announce 的公共泛型函数,它接收任何实现了 Printable 的类型 T。这个函数应打印 Announcement: {info},其中 {info} 是对该项调用 print_info() 后的结果。
  • main.rs:创建两个实现了 Printable 的公共结构体:
    • Person:包含一个公共的 name 字段(String)。它的 print_info 应返回 Person: {name}
    • Product:包含公共的 name(String)和 price(f64)字段。它的 print_info 应返回 Product: {name} - ${price}
    引入你的 printable 模块,使用输入创建一个 Person 和一个 Product,然后分别调用 announce,以展示你的泛型函数适用于任何 Printable 类型。

这种设计的巧妙之处在于,announce 不在乎接收到的是 Person、Product 还是任何未来的类型。它只要求该类型能够通过 print_info() 提供信息。trait 限定会在编译时保证这一点。

你的输出应显示两条公告:

Announcement: Person: {name}
Announcement: Product: {product_name} - ${price}

例如,输入 Alice、Laptop 和 999.99 时:

Announcement: Person: Alice
Announcement: Product: Laptop - $999.99

你将收到三个输入:人物姓名、产品名称和产品价格(解析为 f64)。

亲手试试

mod printable;

use printable::{Printable, announce};

// TODO: 定义一个公开的 Person 结构体,包含公开的 name 字段(String)
// 为 Person 实现 Printable trait
// print_info 应返回 "Person: {name}"

// TODO: 定义一个公开的 Product 结构体,包含公开的 name(String)和 price(f64)字段
// 为 Product 实现 Printable trait
// print_info 应返回 "Product: {name} - ${price}"

fn main() {
    // 读取输入
    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: 使用 person_name 创建一个 Person 实例

    // TODO: 使用 product_name 和 price 创建一个 Product 实例

    // TODO: 将 Person 传给 announce

    // TODO: 将 Product 传给 announce
}

面向对象编程中的所有课

自己练习: Rust 在线编译器