Menu
Coddy logo textTech

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

Часть раздела Объектно-ориентированное программирование путешествия по Rust на Coddy. Урок 60 из 61.

challenge icon

Задание

Легко

Давайте создадим систему библиотечного каталога, которая демонстрирует, как трейты объединяют разные типы в рамках общего интерфейса! Вы создадите каталог, в котором книги и журналы, несмотря на разные свойства, могут описывать себя через общий трейт.

Вы организуете код в трёх файлах:

  • 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() для каждого элемента и выведите результаты
}

Все уроки раздела Объектно-ориентированное программирование

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