ディスプレイ
fmt::Debug
はコンパクトでクリーンであるようには見えませんね。大抵の場合は、アウトプットの見た目をカスタマイズしたほうが好ましいでしょう。これは{}
を使用するfmt::Display
を手動で実装することで可能です。
fmt::Display
はfmt::Debug
より綺麗かもしれませんが、std
ライブラリの場合は問題が生じます。曖昧な(ambiguous)タイプはどのように表示すれば良いでしょう?
例えば、std
ライブラリがあらゆるVec<T>
に対して単一のスタイルを提供していた場合、どのようなスタイルに整形すればよいでしょう?以下の2つのどちらかを選ぶべきでしょうか?
Vec<path>
:/:/etc:/home/username:/bin
(:
で分割)Vec<number>
:1,2,3
(,
で分割)
答えはNOです。あらゆる型に対して理想的なスタイルなどというものはありませんし、std
ライブラリによってそれが提供されているわけでもありません。fmt::Display
はVec<T>
のようなジェネリックなコンテナ用に定義されているわけではありませんので、このような場合はfmt::Debug
を使用するべきです。
ジェネリック でない コンテナ型の場合は、このような問題は生じませんので問題なくfmt::Display
を実装することができます。
fmt::Display
は実装されていますが、fmt::Binary
はされていないので使用できません。
std::fmt
はそのようなトレイトが数多くあり、それぞれに独自の実装が必要です。詳しくはstd::fmt
を参照してください。
演習
上記の例のアウトプットを確認し、Point2D
構造体を参考として、複素数を格納するためのComplex
構造体を定義しましょう。うまく行けば以下のように出力されるはずです。
Display: 3.3 + 7.2i
Debug: Complex { real: 3.3, imag: 7.2 }