Трейт Display
Часть раздела Объектно-ориентированное программирование путешествия по Rust на Coddy. Урок 36 из 61.
Хотя Debug отлично подходит разработчикам для проверки данных, трейт Display предназначен для вывода, отображаемого пользователю. Именно он обеспечивает работу форматировщика {} в println!. В отличие от Debug, Rust не может автоматически вывести реализацию Display. Вы должны реализовать его вручную.
Чтобы реализовать Display, необходимо подключить модуль fmt и реализовать метод fmt:
use std::fmt;
struct Temperature {
celsius: f64,
}
impl fmt::Display for Temperature {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}°C", self.celsius)
}
}
Метод fmt получает Formatter и возвращает fmt::Result. Вы используете макрос write!, чтобы форматировать вывод, обращаясь к полям структуры через self.
Теперь вы можете вывести структуру с помощью стандартного форматировщика {}:
let temp = Temperature { celsius: 23.5 };
println!("{}", temp); // 23.5°C
Ключевое различие: вывод Debug показывает структуру ваших данных (полезно для отладки), а вывод Display имеет аккуратный вид и предназначен для конечных пользователей. Структура может реализовывать оба трейта: используйте {:?} для отладки и {} для чистого вывода.
Задание
ЛегкоДавайте создадим удобную для пользователя систему отображения продуктов! В то время как Debug показывает необработанную структуру ваших данных, trait Display позволяет создавать отформатированный, понятный человеку вывод, идеально подходящий для конечных пользователей.
Вы организуете код в двух файлах:
product.rs: Определите публичную структуруProductс двумя публичными полями:name(String) иprice(f64). Реализуйте traitDisplayдля вашей структуры, чтобы она форматировалась как{name} - ${price}. Не забудьте подключитьstd::fmtи использовать макросwrite!внутри методаfmt.main.rs: Подключите модуль продукта и создайте экземплярProduct, используя предоставленные входные данные. Выведите продукт с помощью стандартного форматировщика{}, чтобы показать результат вашего пользовательского отображения.
trait Display требует вручную реализовать метод fmt: Rust не может автоматически вывести его, как Debug. Это дает вам полный контроль над тем, как ваш тип отображается для пользователей.
Ваш вывод должен отображать продукт в аккуратном, удобном для пользователя формате:
{name} - ${price}Например, при входных данных Wireless Mouse и 29.99:
Wireless Mouse - $29.99Вы получите два входных значения: имя продукта и цену (разберите ее как f64).
Попробуйте сами
mod product;
use product::Product;
fn main() {
let mut name = String::new();
std::io::stdin().read_line(&mut name).expect("Failed to read line");
let name = 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: Создайте экземпляр Product с именем и ценой
// TODO: Выведите продукт, используя форматтер {}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Методы и поведение
Введение в блоки реализацииПараметр SelfИзменяемые методыАссоциированные функцииНесколько блоков реализацииЦепочки вызовов методовИтоги: действия с Rectangle4Проект: Виртуальный питомец
Определение питомцаКормление питомца2Инкапсуляция и модули
Основы модулейКлючевое слово PublicПриватные поляГеттерыСеттерыИтоги — Безопасный сейф5Обобщения
Обобщённые структурыОбобщённые методыНесколько обобщённых типовОбобщённые функцииПовторение — Координатная точка8Трейты как ограничения
Синтаксис ограничений трейтовМножественные ограниченияКонструкция whereВозврат типов с трейтамиИтоги — Обобщённый принтер11Паттерны проектирования в Rust
Паттерн NewtypeКомпозицияТрейт DropFrom и IntoИтоги — Мок-объект Smart Pointer3Продвинутые перечисления
Перечисления с даннымиМетоды в перечисленияхСопоставление вариантов с даннымиСнова об Option EnumИтоги — перечисление Shape6Определение трейтов
Что такое трейт?Реализация трейтовРеализации по умолчаниюПереопределение реализаций по умолчаниюТрейты с параметрамиИтоги — Media PlayerПотренируйтесь самостоятельно: Онлайн-компилятор Rust