Итоги — Обобщённый принтер
Часть раздела 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