Rust by Example

1.2.1 デバッグ

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

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

// この構造体は`fmt::Display`、`fmt::Debug`のいずれによっても
// プリントすることができません。
struct UnPrintable(i32);

// `derive`アトリビュートは、
// この構造体を`fmt::Debug`でプリントするための実装を自動で提供します。
#[derive(Debug)]
struct DebugPrintable(i32);

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

// `Structure`という構造体のための`fmt::Debug`をderiveしています。 // `Structure`は単一の`i32`をメンバに持っています。 #[derive(Debug)] struct Structure(i32); // `Deep`という構造体の中に`Structure`を入れます。 // また、これをプリント可能にしています。 #[derive(Debug)] struct Deep(Structure); fn main() { // `{:?}`によるプリントは `{}`に似ています。 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を手動で実装すればその美しさを取り戻す事ができるでしょう。

See also

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