如何在 std::fmt::Debug 中使用内部 #[derive(Debug)]

arn*_*bpl 1 rust

我想自定义的输出structFooOut,但我不想改变内场的调试输出FooIn这里面FooOut。考虑 Rust代码

#[derive(Default)]
struct FooOut {
    num1: u32,
    num2: u32,
    obj: FooIn,
}

#[derive(Debug, Default)]
struct FooIn {
    bval: bool,
    list: Vec<u32>,
}

impl std::fmt::Debug for FooOut {
    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
        write!(f, "FooOut {{ sum: {}, num1: {}, num2: {}, obj: {} }}",
                   self.num1 + self.num2,
                   self.num1,
                   self.num2,
                   self.obj)  // self.obj is not working without implementing it too
    }
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,我试图自定义FooOut(通过添加sum)的调试输出,但我不想自定义/重新实现FooIn. 有没有办法做到这一点?

Frx*_*rem 5

我建议您使用Formatter::debug_struct(或其同级函数之一)代替自己手动构建调试字符串:

impl std::fmt::Debug for FooOut {
    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
        f.debug_struct("FooOut")
            .field("sum", &(self.num1 + self.num2))
            .field("num1", &self.num1)
            .field("num2", &self.num2)
            .field("obj", &self.obj)
            .finish()
    }
}
Run Code Online (Sandbox Code Playgroud)

游乐场示例

这是#[derive(Debug)]用于为对象构建默认调试字符串的内容。这还有一个额外的好处,即您可以{:?}使用{:#?}.