図書館カタログ
CoddyのRustジャーニー「Object Oriented Programming」セクションの一部 — レッスン 60/61。
チャレンジ
簡単異なる型を共通のインターフェースの下で統一する方法を示す、図書目録システムを構築しましょう!本と雑誌という、異なるプロパティを持つアイテムが、共有されたトレイトを通じて自分自身を説明できる目録を作成します。
コードは以下の3つのファイルに分けて構成します:
catalog.rs:Stringを返す単一のメソッドdescriptionを持つCatalogItemトレイトを定義します。このトレイトは、すべての図書アイテムが満たすべき規約を確立します。items.rs: トレイトを実装する2つの構造体を作成します。Bookはtitleとauthor(どちらもString)を持ち、Magazineはname(String)と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 1564つの入力を受け取ります:本のタイトル、本の著者、雑誌名、および雑誌の号数(最後の一つは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() を呼び出し、結果を出力する
}