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