Каталог библиотеки
Часть раздела Object Oriented Programming путешествия по Rust на Coddy — урок 60 из 61.
Задание
ЛегкоДавайте создадим систему библиотечного каталога, которая демонстрирует, как типажи (traits) объединяют различные типы под общим интерфейсом! Вы создадите каталог, в котором книги и журналы — несмотря на разные свойства — могут описывать себя через общий типаж.
Вы организуете свой код в трех файлах:
catalog.rs: Определите типажCatalogItemс единственным методомdescription, который возвращаетString. Этот типаж устанавливает контракт, который должны выполнять все библиотечные элементы.items.rs: Создайте две структуры, реализующие ваш типаж.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 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, используя book_title и book_author
// TODO: Создать экземпляр Magazine, используя magazine_name и magazine_issue
// TODO: Вызвать description() для каждого элемента и вывести результаты
}
Все уроки раздела Object Oriented Programming
1Методы и поведение
Введение в блоки реализацииПараметр SelfИзменяемые методыАссоциированные функцииНесколько блоков реализацииЦепочки вызовов методовИтоги: действия с Rectangle4Проект: Виртуальный питомец
Определение питомцаКормление питомца2Инкапсуляция и модули
Основы модулейКлючевое слово PublicПриватные поляГеттерыСеттерыИтоги — Безопасный сейф5Обобщения
Обобщённые структурыОбобщённые методыНесколько обобщённых типовОбобщённые функцииПовторение — Координатная точка8Трейты как ограничения
Синтаксис ограничений трейтовМножественные ограниченияКонструкция whereВозврат типов с трейтамиИтоги — Обобщённый принтер11Паттерны проектирования в Rust
Паттерн NewtypeКомпозицияТрейт DropFrom и IntoИтоги — Мок-объект Smart Pointer3Продвинутые перечисления
Перечисления с даннымиМетоды в перечисленияхСопоставление вариантов с даннымиСнова об Option EnumИтоги — перечисление Shape6Определение трейтов
Что такое трейт?Реализация трейтовРеализации по умолчаниюПереопределение реализаций по умолчаниюТрейты с параметрамиИтоги — Media Player