为帮助调试而创建的大多数 struct ,最好使用#[derive(Debug)]
.但是,如果您的 struct 包含没有Debug
的类型,例如traits,则这是不可能的.但是,如果这个特性在我的控制之下,我能做些什么,让用户对这个特性的实现显示在调试消息中吗?
我可以要求实现我的trait 的人也实现Debug
,但我不想再加上这个武断的要求:
trait MyTrait: Debug { ... }
对于我的trait ,我可以实施Debug
:
trait MyTrait { ... }
impl Debug for MyTrait {
fn fmt(&self, f: &mut Formatter) -> fmt::Result {
write!(f, "MyTrait {{ ... }}")
}
}
这不允许实现覆盖Debug
——这几乎就像函数不是虚拟的一样.我怎样才能做到这一点?
use std::fmt;
use std::fmt::{ Formatter, Debug };
#[derive(Debug)]
struct A {
a: Box<Data>,
}
trait Data {}
impl Debug for Data {
fn fmt(&self, f: &mut Formatter) -> fmt::Result {
write!(f, "Data{{ ... }}")
}
}
#[derive(Debug)]
struct B(i32);
impl Data for B {}
fn main() {
let a = A{ a: Box::new(B(42)) };
println!("{:?}", a);
}
输出:
A { a: Data{ ... } }
我想要的是:
A { a: B(42) }
我只想在B
不实现Debug
时得到第一个输出.