Debug
Все типы, которые будут использовать типажи форматирования std::fmt, требуют их реализации для возможности печати. Автоматическая реализация предоставлена только для типов из стандартной библиотеки (std). Все остальные типы должны иметь собственную реализацию.
C помощью типажа fmt::Debug это сделать очень просто. Все типы могут выводить (автоматически создавать, derive) реализацию fmt::Debug. Сделать подобное с fmt::Display невозможно, он должен быть реализован вручную.
#![allow(unused)] fn main() { // Эта структура не может быть напечатана с помощью `fmt::Display` // или с помощью `fmt::Debug` struct UnPrintable(i32); // Атрибут `derive` автоматически реализует // необходимые методы, чтобы была возможность // напечатать структуру `struct` с помощью `fmt::Debug`. #[derive(Debug)] struct DebugPrintable(i32); }
Все типы из библиотеки std также могут быть автоматически распечатаны с помощью {:?}:
// Вывод и реализация `fmt::Debug` для `Structure`. // `Structure` - это структура, которая содержит в себе один `i32`. #[derive(Debug)] struct Structure(i32); // Добавим структуру `Structure` в структуру `Deep`. // Реализуем для `Deep` возможность вывода с помощью fmt::Debug`. #[derive(Debug)] struct Deep(Structure); fn main() { // Вывод с помощью `{:?}` аналогичен `{}`. println!("{:?} месяцев в году.", 12); println!("{1:?} {0:?} - это имя {actor:?}.", "Слэйтер", "Кристиан", actor="актёра"); // `Structure` теперь можно напечатать! println!("Теперь {:?} будет выведена на экран!", Structure(3)); // Проблема с `выводом (derive)`, в том, что у нас не будет контроля // над тем, как будет выглядеть результат. // Что, если мы хотим напечатать просто `7`? println!("А теперь напечатаем {:?}", Deep(Structure(7))); }
Так что fmt::Debug определённо позволяет распечатать объект, но жертвует некоторым изяществом. Rust также обеспечивает "красивую печать" с помощью {:#?}.
#[derive(Debug)] struct Person<'a> { name: &'a str, age: u8 } fn main() { let name = "Peter"; let age = 27; let peter = Person { name, age }; // Pretty print println!("{:#?}", peter); }
Можно вручную реализовать fmt::Display для управления отображением.