Трейт Debug
Часть раздела Объектно-ориентированное программирование путешествия по Rust на Coddy. Урок 35 из 61.
Стандартная библиотека Rust включает множество предопределённых трейтов, предоставляющих общую функциональность. Одним из наиболее полезных для разработки является трейт Debug, который позволяет выводить содержимое структуры для проверки.
Если попытаться напрямую вывести пользовательскую структуру, Rust не будет знать, как её отобразить:
struct Player {
name: String,
score: u32,
}
let p = Player { name: String::from("Alice"), score: 100 };
println!("{:?}", p); // Ошибка! Debug не реализован
Форматтер {:?} требует трейта Debug. Вместо того чтобы реализовывать его вручную, Rust предоставляет сокращённый способ: атрибут #[derive]. Размести его непосредственно над определением структуры:
#[derive(Debug)]
struct Player {
name: String,
score: u32,
}
let p = Player { name: String::from("Alice"), score: 100 };
println!("{:?}", p); // Player { name: "Alice", score: 100 }
Атрибут #[derive(Debug)] сообщает компилятору, что нужно автоматически сгенерировать реализацию Debug. Это работает, пока все поля в вашей структуре также реализуют Debug (что справедливо для большинства стандартных типов).
Для более удобного чтения вывода с вложенными структурами используйте {:#?} для красивой печати:
println!("{:#?}", p);
// Player {
// name: "Alice",
// score: 100,
// }
Выведение Debug необходимо во время разработки. Оно позволяет быстро проверять данные без написания собственного кода форматирования.
Задание
ЛегкоДавайте сделаем ваши структуры доступными для просмотра, выведя трейт Debug! Вы создадите простую систему inventory, в которой элементы можно выводить для целей отладки.
Вы организуете код в двух файлах:
inventory.rs: Определите публичную структуруItemс двумя публичными полями:name(String) иquantity(u32). Используйте атрибут#[derive(Debug)], чтобы автоматически реализовать трейт Debug для вашей структуры.main.rs: Подключите модуль inventory и создайте экземплярItem, используя предоставленные входные данные. Выведите элемент с помощью отладочного форматировщика{:?}, чтобы отобразить его внутреннюю структуру.
Преимущество выведения Debug заключается в том, что Rust автоматически генерирует код форматирования: ручная реализация не нужна! Вашей структуре нужен только атрибут, и она становится доступной для вывода с помощью {:?}.
Ваш вывод должен отображать элемент в отладочном формате Rust:
Item { name: "{name}", quantity: {quantity} }Например, для входных данных Keyboard и 15:
Item { name: "Keyboard", quantity: 15 }Вы получите два входных значения: имя элемента и количество (разберите его как u32).
Попробуйте сами
mod inventory;
use inventory::Item;
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 quantity_str = String::new();
std::io::stdin().read_line(&mut quantity_str).expect("Failed to read line");
let quantity: u32 = quantity_str.trim().parse().expect("Failed to parse quantity");
// TODO: Создайте экземпляр Item с заданными name и quantity
// TODO: Выведите item, используя отладочный форматтер {:?}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Методы и поведение
Введение в блоки реализацииПараметр SelfИзменяемые методыАссоциированные функцииНесколько блоков реализацииЦепочки вызовов методовИтоги: действия с Rectangle4Проект: Виртуальный питомец
Определение питомцаКормление питомца2Инкапсуляция и модули
Основы модулейКлючевое слово PublicПриватные поляГеттерыСеттерыИтоги — Безопасный сейф5Обобщения
Обобщённые структурыОбобщённые методыНесколько обобщённых типовОбобщённые функцииПовторение — Координатная точка8Трейты как ограничения
Синтаксис ограничений трейтовМножественные ограниченияКонструкция whereВозврат типов с трейтамиИтоги — Обобщённый принтер11Паттерны проектирования в Rust
Паттерн NewtypeКомпозицияТрейт DropFrom и IntoИтоги — Мок-объект Smart Pointer3Продвинутые перечисления
Перечисления с даннымиМетоды в перечисленияхСопоставление вариантов с даннымиСнова об Option EnumИтоги — перечисление Shape6Определение трейтов
Что такое трейт?Реализация трейтовРеализации по умолчаниюПереопределение реализаций по умолчаниюТрейты с параметрамиИтоги — Media PlayerПотренируйтесь самостоятельно: Онлайн-компилятор Rust