Debug

std::fmtのフォーマット用トレイトを使用したい型は、出力できるように実装されている必要があります。stdライブラリの型のように自動で出力可能なものもありますが、他はすべて 手動で実装する必要があります。

fmt::Debugというトレイトはこれを簡略化します。 すべての 型はfmt::Debugの実装を導出(derive)、(すなわち自動で作成)することができるためです。fmt::Displayの場合はやはり手動で実装しなくてはなりません。

#![allow(unused)] fn main() { // この構造体は`fmt::Display`、`fmt::Debug`のいずれによっても // 出力することができません。 struct UnPrintable(i32); // `derive`アトリビュートは、 // この構造体を`fmt::Debug`で出力するための実装を自動で提供します。 #[derive(Debug)] struct DebugPrintable(i32); }

stdライブラリの型の場合は、自動的に{:?}により出力可能になっています。

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

fmt::Debugは確実に出力可能にしてくれるのですが、一方である種の美しさを犠牲にしています。Rustは{:#?}による「見栄えの良い出力」も提供します。

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

手動でfmt::Displayを実装することで出力結果を思い通りにできます。

参照

アトリビュート, derive, std::fmt, 構造体