给定以下程序:
use std::fmt;
struct A;
impl fmt::Debug for A {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
format!("nAn").fmt(f)
}
}
fn main() {
println!("{:?}", A);
}
我得到以下输出:
"nAn"
有没有可能把这些换行符"翻译"成真正的换行符?不幸的是,我不能使用Display
特性,因为这是用于hamcrest rust的,它在显示错误消息时使用Debug
特性。
不要使用format!
,而是使用write!
宏。从文档中可以看出,write!
直接写入缓冲区,而format!
创建一个String
,并将参数格式化为fmt::Debug
,后者会自动转义特殊字符。
use std::fmt;
struct A;
impl fmt::Debug for A {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "nAn")
}
}
fn main() {
println!("{:?}", A);
}
Bluss的观点是解开你的谜团的真正解决方案:
use std::fmt;
struct A;
impl fmt::Debug for A {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
fmt::Display::fmt(&format!("nAn"), f)
}
}
fn main() {
println!("{:?}", A);
}
当然,write!
的答案最终会更简单,但它并不能解释你为什么会遇到这样的问题。