总结:泛型打印器
本课属于 Coddy Rust 学习旅程的“面向对象编程”单元。第 44 课,共 61 课。
挑战
简单让我们构建一个灵活的公告系统,展示 trait 限定的强大之处!你将创建一个 Printable trait 和一个泛型函数,它可以公告任何实现了这个 trait 的类型,展示泛型和 trait 如何协同工作,从而创建可复用且类型安全的代码。
你将把代码分到两个文件中:
printable.rs:定义一个公共的Printabletrait,其中包含一个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}
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 在线编译器