Rust by Example中文

1.2.1 Debug

想要使用std::fmt格式化traints的所有类型都需要可打印(printable)的实现。 自动实现仅提供给诸如std库里的类型。其他类型则必须想办法手工实现。

fmt::Debug trait 使用起来非常简单。所有 类型都可以 derive (自动创建) fmt::Debug 的实现. fmt::Display并非一定要手工实现。

// 该结构体不能被`fmt::Display`和 `fmt::Debug`打印
struct UnPrintable(i32);

// `derive`属性会用`fmt::Debug`为该`结构体`自动创建必须的可打印实现。
#[derive(Debug)]
struct DebugPrintable(i32);

std标准库类型使用{:?}也可以自动实现可打印:

// 从`fmt::Debug` 中导出(derive)实现。 // `Structure`是包含了 单个`i32`类型参数的结构体。 #[derive(Debug)] struct Structure(i32); // 置于结构体`Deep`中的`Structure`也是可打印的。 #[derive(Debug)] struct Deep(Structure); fn main() { // `{:?}`用法于 `{}`相似。 println!("{:?} months in a year.", 12); println!("{1:?} {0:?} is the {actor:?} name.", "Slater", "Christian", actor="actor's"); // `Structure` 是可打印的! println!("Now {:?} will print!", Structure(3)); // 使用`derive`的问题是对结果如何显示没有控制权。 // 假如我这里想显示`7`呢? println!("Now {:?} will print!", Deep(Structure(7))); }

所以fmt::Debug 肯定可以实现可打印,但是会失去一些优雅。手工实现fmt::Display 会解决这个问题。

更多参考

attributes, derive, std::fmt, 以及 struct