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

rust rust-obsolete

4267 просмотра

2 ответа

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

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

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

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

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

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

Автор: ujh Источник Размещён: 12.11.2019 09:14

Ответы (2)


33 плюса

Решение

Старая 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]д Debugреализации).

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

Автор: huon Размещён: 10.01.2015 02:08

5 плюса

Ответ должен использовать {:?}вместо {}в format!.

Автор: ujh Размещён: 10.01.2015 10:32
Вопросы из категории :
32x32