鉴于以下计划:
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
特征。
答案 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!
的答案在最后运行中更简单,但它并不能解释您遇到问题的原因。