所有类型的要使用 std::fmt 格式化 traits 执行打印。 仅提供自动的实现类型,如在 std 库。 其他的必须以某种方式来手动实现。
fmt::Debug trait 使这个非常简单。 所有的类型都可以 derive (自动创建)由 fmt::Debug 实现。 这是不正确的, fmt::Display 必须手动执行。
// This structure cannot be printed either with `fmt::Display` or // with `fmt::Debug` struct UnPrintable(i32); // The `derive` attribute automatically creates the implementation // required to make this `struct` printable with `fmt::Debug`. #[derive(Debug)] struct DebugPrintable(i32);所有的std 库类型自动打印也使用
{:?} :
// Derive the `fmt::Debug` implementation for `Structure`. `Structure`
// is a structure which contains a single `i32`.
#[derive(Debug)]
struct Structure(i32);
// Put a `Structure` inside of the structure `Deep`. Make it printable
// also.
#[derive(Debug)]
struct Deep(Structure);
fn main() {
// Printing with `{:?}` is similar to with `{}`.
println!("{:?} months in a year.", 12);
println!("{1:?} {0:?} is the {actor:?} name.",
"Slater",
"Christian",
actor="actor's");
// `Structure` is printable!
println!("Now {:?} will print!", Structure(3));
// The problem with `derive` is there is no control over how
// the results look. What if I want this to just show a `7`?
println!("Now {:?} will print!", Deep(Structure(7)));
}
因此 fmt::Debug 绝对可以打印的,但牺牲了一些优雅。手动实现 fmt::Display 将解决这个问题。