Rust 使用换行符的调试特性实现

Rust 使用换行符的调试特性实现,rust,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" 是否有可能将这些换行符“翻译”成真正的换行符

鉴于以下计划:

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"
是否有可能将这些换行符“翻译”成真正的换行符?不幸的是,我不能使用
显示
特性,因为这是用于显示错误消息时使用
调试
特性的。

而不是使用宏。通过查看文档,
write直接写入缓冲区,而
格式化
创建一个
字符串
,并将参数格式化为
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);
}
是解开你谜团的真正方法:

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);
}

当然,答案用
在最后运行时更简单,但它不能解释出现问题的原因。

您调用的
fmt
String
上的
Debug::fmt
,它会转义这样的特殊字符。字符串不会自动转义字符。@Shepmaster更新以澄清。