Menu
Coddy logo textTech

Трейт 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 необходимо во время разработки. Оно позволяет быстро проверять данные без написания собственного кода форматирования.

challenge icon

Задание

Легко

Давайте сделаем ваши структуры доступными для просмотра, выведя трейт 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, используя отладочный форматтер {:?}
}
quiz iconПроверьте себя

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

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

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