显示 Display
fmt::Debug
的输出往往不够简洁清晰,因此自定义输出外观通常更有优势。 这可以通过手动实现 fmt::Display
来完成, 它使用 {}
打印标记。实现方式如下:
fmt::Display
可能比 fmt::Debug
更简洁,但这给 std
库带来了一个问题:如何显示歧义类型?例如,如果 std
库为所有 Vec<T>
实现统一的样式,应该采用哪种样式?是以下两种之一吗?
Vec<path>
:/:/etc:/home/username:/bin
(以:
分隔)Vec<number>
:1,2,3
(以,
分隔)
答案是否定的。因为不存在适用于所有类型的理想样式,std
库也不应擅自规定一种。因此,fmt::Display
并未为 Vec<T>
或其他泛型容器实现。在这些泛型情况下,必须使用 fmt::Debug
。
不过,这不是问题。对于任何新的非泛型容器类型,都可以实现 fmt::Display
。
因此,虽然实现了 fmt::Display
,但未实现 fmt::Binary
,所以无法使用。std::fmt
包含许多这样的traits
,每个都需要单独实现。更多详情请参阅 std::fmt
。
练习
查看上述示例的输出后,参考 Point2D
结构体,向示例中添加一个 Complex
结构体。以相同方式打印时,输出应为:
Display: 3.3 +7.2i
Debug: Complex { real: 3.3, imag: 7.2 }
Display: 4.7 -2.3i
Debug: Complex { real: 4.7, imag: -2.3 }
额外练习:在 +
/-
符号前添加一个空格。
如果你遇到困难,这里有三个提示:
- 你可以使用
:0>2
用零填充到宽度为 2。 - 额外练习:查看
if
-else
分支语句以及abs
函数。