对于今天的 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`
有没有办法获得旧的行为?当然,不能要求每种类型都手动实现这一点。
对于今天的 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`
有没有办法获得旧的行为?当然,不能要求每种类型都手动实现这一点。
旧Show
特征被拆分为Display
和Debug
。
Display
专为面向用户的输出而设计,并使用空白/默认格式说明符(例如{}
,{:.10}
{foo:}
都使用Display
)
Debug
专为调试/内部输出而设计并使用?
格式说明符(例如{:?}
, {:.10?}
,{foo:?}
都在使用Debug
)
因此,要使用由#[derive(Debug)]
一个人创建的实现应该写println!("{:?}", ...)
,而不是旧的println!("{}", ...)
。
only Debug
can be #[derive]
d 因为 output likeFoo { x: 1, y: 2 }
不太可能是正确的面向用户的输出,在大多数情况下(我确定它适用于某些情况,但是程序员可以自己编写实现Display
,甚至直接调用#[derive]
d实施Debug
)。
这最初是在RFC 504中描述的,并且在RFC 565中正在进行讨论,使上述指南更加具体。
答案是使用{:?}
而不是{}
in format!
。