18

对于今天的 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`

有没有办法获得旧的行为?当然,不能要求每种类型都手动实现这一点。

4

2 回答 2

38

Show特征被拆分为DisplayDebug

  • Display专为面向用户的输出而设计,并使用空白/默认格式说明符(例如{}{:.10} {foo:}都使用Display

  • Debug专为调试/内部输出而设计并使用?格式说明符(例如{:?}, {:.10?},{foo:?}都在使用Debug

因此,要使用由#[derive(Debug)]一个人创建的实现应该写println!("{:?}", ...),而不是旧的println!("{}", ...)

only Debugcan be #[derive]d 因为 output likeFoo { x: 1, y: 2 }不太可能是正确的面向用户的输出,在大多数情况下(我确定它适用于某些情况,但是程序员可以自己编写实现Display,甚至直接调用#[derive]d实施Debug)。

这最初是在RFC 504中描述的,并且在RFC 565中正在进行讨论,使上述指南更加具体。

于 2015-01-10T14:08:38.460 回答
5

答案是使用{:?}而不是{}in format!

于 2015-01-10T10:32:47.387 回答