Menu
CoddyTech

图书馆目录

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

challenge icon

挑战

简单

让我们构建一个图书馆目录系统,展示 trait 如何通过统一接口整合不同类型!你将创建一个目录,其中的书籍和杂志虽然属性不同,但都能通过共享的 trait 描述自身。

你需要将代码分到三个文件中:

  • catalog.rs:定义一个包含单个方法 description 的 CatalogItem trait,该方法会返回一个 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 在线编译器