Все типы, которые будут использовать типажи (traits)
форматирования std::fmt
требуют
их реализации для возможности печати. Автоматическая реализация предоставлена только для
типов из стандартной библиотеки (std)
. Все остальные типы должны иметь собственную реализацию.
C помощью типажа
fmt::Debug
это сделать очень просто. Все типы могут
выводить (derive)
(автоматически создавать) реализацию fmt::Debug
. Сделать подобное с fmt::Display
невозможно, он должен быть реализован вручную.
// Эта структура не может быть напечатана с помощью `fmt::Display`
// или с помощью `fmt::Debug`
struct UnPrintable(i32);
// Атрибут `выводить (derive)` автоматически реализует
// необходимые методы, чтобы была возможность
// печатать данную `структуру` с помощью `fmt::Debug`.
#[derive(Debug)]
struct DebugPrintable(i32);
Все типы в стандартной библиотеке (std)
могут быть напечатаны с {:?}
:
// Вывод и реализация `fmt::Debug` для `Structure`. `Structure` // `Structure` - это структура, которая содержит в себе один `i32`. #[derive(Debug)] struct Structure(i32); // Добавим структуру `Structure` в структуру `Deep`. // Релазиуем для `Deep` возможность вывода с помощью fmt::Debug`. #[derive(Debug)] struct Deep(Structure); fn main() { // Printing with `{:?}` is similar to with `{}`. // Вывод с помощью `{:?}` аналогичен `{}`. println!("{:?} months in a year.", 12); println!("{1:?} {0:?} is the {actor:?} name.", "Slater", "Christian", actor="actor's"); // `Structure` теперь можно напечатать! println!("Now {:?} will print!", Structure(3)); // Проблема с `выводом (derive)`, в том, что у нас не будет контроля // над тем, как будет выглядить результат. // Что если мы хотим напечатать просто `7`? println!("Now {:?} will print!", Deep(Structure(7))); }
fmt::Debug
дает возможность выводить информацию о обьектах на экран, жертвуя при этом элегантностью. Реализовав типаж fmt::Display
вручную можно исправить это.
attributes, derive
, std::fmt
,
и struct