图书馆目录
本课属于 Coddy Rust 学习旅程的“面向对象编程”单元。第 60 课,共 61 课。
挑战
简单让我们构建一个图书馆目录系统,展示 trait 如何通过统一接口整合不同类型!你将创建一个目录,其中的书籍和杂志虽然属性不同,但都能通过共享的 trait 描述自身。
你需要将代码分到三个文件中:
catalog.rs:定义一个包含单个方法description的CatalogItemtrait,该方法会返回一个String。这个 trait 规定了所有图书馆藏品都必须遵守的约定。items.rs:创建两个实现该 trait 的结构体。Book有title和author(两者都是字符串),而Magazine有name(字符串)和issue期号(u32)。每个结构体都应实现CatalogItem,并使用各自独特的描述格式。main.rs:引入两个模块,并使用提供的输入创建Book和Magazine实例。对每个条目调用description方法并打印结果。
Book 的描述应使用以下格式:
Book: {title} by {author}Magazine 的描述应使用以下格式:
Magazine: {name}, Issue {issue}例如,输入 1984、George Orwell、Nature 和 42 时:
Book: 1984 by George Orwell
Magazine: Nature, Issue 42输入 The Rust Book、Steve Klabnik、Science Weekly 和 156 时:
Book: The Rust Book by Steve Klabnik
Magazine: Science Weekly, Issue 156你会收到四项输入:书名、作者、杂志名称和杂志期号(最后一项要解析为 u32)。
亲手试试
mod catalog;
mod items;
use catalog::CatalogItem;
use items::{Book, Magazine};
fn main() {
// 读取输入
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: 使用 book_title 和 book_author 创建一个 Book 实例
// TODO: 使用 magazine_name 和 magazine_issue 创建一个 Magazine 实例
// TODO: 对每个条目调用 description(),并打印结果
}
面向对象编程中的所有课
自己练习: Rust 在线编译器