Menu
Coddy logo textTech

Каталог библиотеки

Часть раздела Object Oriented Programming путешествия по Rust на Coddy. Урок 60 из 61.

challenge icon

Задание

Легко

Давайте создадим систему библиотечного каталога, которая демонстрирует, как типажи (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

Потренируйтесь самостоятельно: Онлайн-компилятор Rust