显示(Display)
fmt::Debug
通常看起来不太简洁,因此自定义输出的外观经常是更可取的。这需要通过手动实现 fmt::Display
来做到。fmt::Display
采用 {}
标记。实现方式看起来像这样:
fmt::Display
的效果可能比 fmt::Debug
简洁,但对于 std
库来说,这就有一个问题。模棱两可的类型该如何显示呢?举个例子,假设标准库对所有的 Vec<T>
都实现了同一种输出样式,那么它应该是哪种样式?下面两种中的一种吗?
Vec<path>
:/:/etc:/home/username:/bin
(使用:
分割)Vec<number>
:1,2,3
(使用,
分割)
我们没有这样做,因为没有一种合适的样式适用于所有类型,标准库也并不擅自规定一种样式。对于 Vec<T>
或其他任意泛型容器(generic container),fmt::Display
都没有实现。因此在这些泛型的情况下要用 fmt::Debug
。
这并不是一个问题,因为对于任何非泛型的容器类型, fmt::Display
都能够实现。
fmt::Display
被实现了,而 fmt::Binary
没有,因此 fmt::Binary
不能使用。
std::fmt
有很多这样的 trait
,它们都要求有各自的实现。这些内容将在后面的 std::fmt
章节中详细介绍。
动手试一试
检验上面例子的输出,然后在示例程序中,仿照 Point2D
结构体增加一个名为 Complex
的结构体。
使用一样的方式打印,输出结果要求是这个样子:
Display: 3.3 + 7.2i
Debug: Complex { real: 3.3, imag: 7.2 }