使用换行符调试特征实现



给定以下程序:

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!的答案最终会更简单,但它并不能解释你为什么会遇到这样的问题。