Menu
Coddy logo textTech

Итоги — Обобщённый принтер

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

challenge icon

Задание

Легко

Давайте создадим гибкую систему объявлений, которая демонстрирует мощь ограничений типажей (trait bounds)! Вы создадите типаж Printable и универсальную функцию, которая может объявлять любой тип, реализующий этот типаж — показывая, как обобщения (generics) и типажи работают вместе для создания многоразового и типобезопасного кода.

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

  • printable.rs: Определите публичный типаж Printable с методом print_info, который принимает &self и возвращает String. Затем создайте публичную универсальную функцию с именем announce, которая принимает любой тип T, реализующий Printable. Эта функция должна выводить Announcement: {info}, где {info} — это результат вызова print_info() для элемента.
  • main.rs: Создайте две публичные структуры, реализующие Printable:
    • Person — с публичным полем name (String). Его метод print_info должен возвращать Person: {name}
    • Product — с публичными полями name (String) и price (f64). Его метод print_info должен возвращать Product: {name} - ${price}
    Подключите ваш модуль printable, используйте входные данные для создания Person и Product, а затем вызовите announce для каждого из них, чтобы продемонстрировать, что ваша универсальная функция работает с любым типом Printable.

Прелесть этой конструкции в том, что функции announce неважно, получает ли она Person, Product или любой другой тип в будущем — ей требуется только, чтобы тип мог предоставлять информацию через print_info(). Ограничение типажа гарантирует это на этапе компиляции.

Ваш вывод должен содержать оба объявления:

Announcement: Person: {name}
Announcement: Product: {product_name} - ${price}

Например, при входных данных Alice, Laptop и 999.99:

Announcement: Person: Alice
Announcement: Product: Laptop - $999.99

Вы получите три входных значения: имя человека, название продукта и цену продукта (преобразуйте в f64).

Попробуйте сами

mod printable;

use printable::{Printable, announce};

// TODO: Определите публичную структуру Person с публичным полем name (String)
// Реализуйте типаж Printable для Person
// print_info должен возвращать "Person: {name}"

// TODO: Определите публичную структуру Product с публичными полями name (String) и price (f64)
// Реализуйте типаж Printable для Product
// print_info должен возвращать "Product: {name} - ${price}"

fn main() {
    // Чтение входных данных
    let mut person_name = String::new();
    std::io::stdin().read_line(&mut person_name).expect("Failed to read line");
    let person_name = person_name.trim().to_string();

    let mut product_name = String::new();
    std::io::stdin().read_line(&mut product_name).expect("Failed to read line");
    let product_name = product_name.trim().to_string();

    let mut price_input = String::new();
    std::io::stdin().read_line(&mut price_input).expect("Failed to read line");
    let price: f64 = price_input.trim().parse().expect("Failed to parse price");

    // TODO: Создайте экземпляр Person с person_name

    // TODO: Создайте экземпляр Product с product_name и price

    // TODO: Вызовите announce для Person

    // TODO: Вызовите announce для Product
}

Все уроки раздела Object Oriented Programming