With today\'s Rust nightly the following code doesn\'t compile anymore:
#[derive(Show)]
enum S {
A,
B
}
fn main() {
println!(\"{}\", S::A);
}
The answer is to use {:?}
instead of {}
in format!
.
The old Show
trait was split into Display
and Debug
.
Display
is designed for user-facing output, and uses the blank/default format specifier (e.g. {}
, {:.10}
{foo:}
are all using Display
)
Debug
is designed for debugging/internal output and uses the ?
format specifier (e.g. {:?}
, {:.10?}
, {foo:?}
are all using Debug
)
Hence, to use the implementation created by #[derive(Debug)]
one should write println!("{:?}", ...)
, instead of the old println!("{}", ...)
.
Only Debug
can be #[derive]
d since output like Foo { x: 1, y: 2 }
is unlikely to be the correct user-facing output, for most situations (I'm sure it is for some, but then the programmer can write the implementation of Display
to do that themselves, or even call directly into the #[derive]
d Debug
implementation).
This was originally described in RFC 504 and there is ongoing discussion in RFC 565, making the guidelines stated above more concrete.