为什么#[derive(Show)]不再起作用了?

时间:2015-01-10 10:07:03

标签: rust rust-obsolete

使用今天的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`

有没有办法解决旧行为?当然,不需要为每种类型手动实现这一点。

2 个答案:

答案 0 :(得分:31)

旧的Show特征分为DisplayDebug

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

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

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

只有println!("{}", ...)可以是Debug d,因为像#[derive]这样的输出在大多数情况下不太可能是面向用户的正确输出(我确定它适用于某些情况) ,但程序员可以编写Foo { x: 1, y: 2 }的实现来自己完成,甚至可以直接调用Display d #[derive]实现。

最初在RFC 504中对此进行了描述,RFC 565中正在进行讨论,使上述指导原则更为具体。

答案 1 :(得分:5)

答案是在{:?}中使用{}代替format!