Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why does #[derive(Show)] not work anymore?

With today's Rust nightly the following code doesn't compile anymore:

#[derive(Show)]
enum S {
    A,
    B
}

fn main() {
    println!("{}", S::A);
}

Instead it gives me the following error message:

error: the trait `core::fmt::String` is not implemented for the type `S`

Is there a way to get the old behaviour? Surely it can't be required to implement this by hand for each type.

like image 363
ujh Avatar asked Jan 10 '15 10:01

ujh


2 Answers

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.

like image 149
huon Avatar answered Oct 19 '22 11:10

huon


The answer is to use {:?} instead of {} in format!.

like image 43
ujh Avatar answered Oct 19 '22 12:10

ujh