1.2.1 Debug
std::fmt
형식화 trait
을 사용하고자 하는 모든 타입들은 출력하기 위해 구현이 요구된다. std
라이브러리에 있는 타입들처럼 단지 자동 구현이 제공된다. 모든 다른 것들은 반드시 어떻게 할지 수동으로 구현되어야 한다.
All types which want to use std::fmt
formatting traits
require an
implementation to be printable. Automatic implementations are only provided
for types such as in the std
library. All others must be manually
implemented somehow.
fmt::Debug
trait
이 이의 복잡함을 많이 경감해준다. 모든 타입들은 fmt::Debug
구현을 파생(drive)
할 수 있다(자동으로 생성). 이는 fmt::Display
로는 적합하지 않고 반드시 수동으로 구현되야 한다.
The fmt::Debug
trait
makes this very straightforward. All types can
derive
(automatically create) the fmt::Debug
implementation. This is
not true for fmt::Display
which must be manually implemented.
/ 이 구조체는 `fmt::Display`나 `fmt::Debug`로는 출력되지 않는다.
// This structure cannot be printed either with `fmt::Display` or
// with `fmt::Debug`
struct UnPrintable(i32);
// `derive` 속성으로 이 `struct`를 `fmt::Debug`로 출력 가능하도록 자동 구현한다.
// The `derive` attribute automatically creates the implementation
// required to make this `struct` printable with `fmt::Debug`.
#[derive(Debug)]
struct DebugPrintable(i32);
모든 std
라이브러리 타입들도 자동으로 {:?}
를 통해 출력 가능하다:
All std
library types automatically are printable with {:?}
too:
// Derive the `fmt::Debug` implementation for `Structure`. `Structure` // is a structure which contains a single `i32`. #[derive(Debug)] struct Structure(i32); // Put a `Structure` inside of the structure `Deep`. Make it printable // also. #[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` is printable! println!("Now {:?} will print!", Structure(3)); // The problem with `derive` is there is no control over how // the results look. What if I want this to just show a `7`? println!("Now {:?} will print!", Deep(Structure(7))); }
So fmt::Debug
definitely makes this printable but sacrifices some
elegance. Manually implementing fmt::Display
will fix that.
See also
attributes, derive
, std::fmt
,
and struct