调试
所有要用到std::fmt
格式化的traits
类型都需要转化成可打印的实现。std
库这些类型能够自动实现。但所有其他类型都必须手动来实现。
fmt::Debug
trait
使上面工作变得相当简单。所有类型都能推导(自动创建)fmt::Debug
的实现。但是 fmt::Display
需要手动来实现。
# #![allow(unused_variables)] #fn main() { // 这种结构体不能使用`fmt::Display`或`fmt::Debug`来进行打印。 struct UnPrintable(i32); // `derive`属性会自动创建实现,借助`fmt::Debug`使得这个`struct`能够打印。 #[derive(Debug)] struct DebugPrintable(i32); #}
所有std
库类型加上{:?}
后也能够自动打印:
// 从 `fmt::Debug` 获得实现给 `Structure`。 // `Structure` 是一个包含`i32`基本类型的结构体。 #[derive(Debug)] struct Structure(i32); // 将 `Structure` 放到结构体 `Deep` 中。使 `Deep` 也能够打印。 #[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
将能够弥补这些问题。