Каталог библиотеки
Часть раздела 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Потренируйтесь самостоятельно: Онлайн-компилятор Rust