Все типы, которые будут использовать типажи (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