使用换行符调试特征实现

时间:2015-09-30 19:53:37

标签: rust

鉴于以下计划:

use std::fmt;

struct A;

impl fmt::Debug for A {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        format!("\nA\n").fmt(f)
    }
} 

fn main() {
    println!("{:?}", A);
}

我得到以下输出:

"\nA\n"

以某种方式可以将这些换行符“翻译”成真正的换行符吗?遗憾的是,我无法使用Display特征,因为这与hamcrest-rust一起使用,click在显示错误消息时会使用Debug特征。

2 个答案:

答案 0 :(得分:5)

而不是使用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, "\nA\n")
    }
} 

fn main() {
    println!("{:?}", A);
}

答案 1 :(得分:2)

Bluss's point是您神秘的真正解决方案:

use std::fmt;

struct A;

impl fmt::Debug for A {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        fmt::Display::fmt(&format!("\nA\n"), f)
    }
} 

fn main() {
    println!("{:?}", A);
}

当然,write!的答案在最后运行中更简单,但它并不能解释您遇到问题的原因。