Почему # [getive (Show)] больше не работает?

С сегодняшним днем ​​Rust, следующий код больше не компилируется:

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

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

Вместо этого появляется следующее сообщение об ошибке:

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

Есть ли способ получить старое поведение? Разумеется, это не может потребоваться для реализации этого вручную для каждого типа.

Ответы

Ответ 1

Старая черта Show была разделена на Display и Debug.

  • Display предназначен для вывода, обращенного к пользователю, и использует спецификатор формата пустой/по умолчанию (например, {}, {:.10} {foo:} все используют Display)

  • Debug предназначен для отладки/внутреннего вывода и использует спецификатор формата ? (например, {:?}, {:.10?}, {foo:?} все используют Debug)

Следовательно, для использования реализации, созданной #[derive(Debug)], следует написать println!("{:?}", ...) вместо старого println!("{}", ...).

Только Debug может быть #[derive] d, так как вывод, подобный Foo { x: 1, y: 2 }, вряд ли будет правильным выходом для пользователя, для большинства ситуаций (я уверен, что это для некоторых, но тогда программист может написать реализация Display, чтобы сделать это сами, или даже вызвать непосредственно в реализацию #[derive] d Debug).

Это было изначально описано в RFC 504 и продолжается обсуждение в RFC 565, сделав изложенные выше рекомендации более конкретными.

Ответ 2

Благодаря Цехану. Ответ заключается в использовании {:?} вместо {} в format!.