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

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