使用今天的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`
有没有办法解决旧行为?当然,不需要为每种类型手动实现这一点。
答案 0 :(得分:31)
旧的Show
特征分为Display
和Debug
。
Display
专为面向用户的输出而设计,并使用空白/默认格式说明符(例如{}
,{:.10}
{foo:}
全部使用{{ 1}})
Display
专为调试/内部输出而设计,并使用Debug
格式说明符(例如?
,{:?}
,{:.10?}
全部使用{foo:?}
)
因此,要使用Debug
创建的实现,应该编写#[derive(Debug)]
,而不是旧的println!("{:?}", ...)
。
只有println!("{}", ...)
可以是Debug
d,因为像#[derive]
这样的输出在大多数情况下不太可能是面向用户的正确输出(我确定它适用于某些情况) ,但程序员可以编写Foo { x: 1, y: 2 }
的实现来自己完成,甚至可以直接调用Display
d #[derive]
实现。
答案 1 :(得分:5)
答案是在{:?}
中使用{}
代替format!
。