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