Menu
Coddy logo textTech

Трейт 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 имеет аккуратный вид и предназначен для конечных пользователей. Структура может реализовывать оба трейта: используйте {:?} для отладки и {} для чистого вывода.

challenge icon

Задание

Легко

Давайте создадим удобную для пользователя систему отображения продуктов! В то время как Debug показывает необработанную структуру ваших данных, trait Display позволяет создавать отформатированный, понятный человеку вывод, идеально подходящий для конечных пользователей.

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

  • product.rs: Определите публичную структуру Product с двумя публичными полями: name (String) и price (f64). Реализуйте trait Display для вашей структуры, чтобы она форматировалась как {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: Выведите продукт, используя форматтер {}
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование

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