2个版本
0.1.1 | 2022年2月23日 |
---|---|
0.1.0 | 2021年7月16日 |
#216 in 值格式化
55KB
680 行
Debug2
debug2
是一个基于 std::fmt
为什么不直接使用 Debug
Debug
特性很好,但问题是它不适合嵌套结构。要么你使用 {:?}
得到一个过长的行,要么行数太多,信息不足。
let complex_structure = vec![
vec![Some(1), Some(2), Some(3), None],
vec![Some(2), None],
vec![Some(4), Some(7)],
vec![Some(1), Some(2), Some(3), None],
];
let one_line = format!("{:?}", complex_structure);
assert_eq!(one_line, "[[Some(1), Some(2), Some(3), None], [Some(2), None], [Some(4), Some(7)], [Some(1), Some(2), Some(3), None]]");
let many_lines = format!("{:#?}", complex_structure);
assert_eq!(many_lines, "[
[
Some(
1,
),
Some(
2,
),
Some(
3,
),
None,
],
[
Some(
2,
),
None,
],
[
Some(
4,
),
Some(
7,
),
],
[
Some(
1,
),
Some(
2,
),
Some(
3,
),
None,
],
]")
debug2
旨在成为第三种选择,它能正确处理这个问题。
use debug2::pprint;
let complex_structure = vec![
vec![Some(1), Some(2), Some(3), None],
vec![Some(2), None],
vec![Some(4), Some(7)],
vec![Some(1), Some(2), Some(3), None],
vec![Some(2), None],
vec![Some(4), Some(7)],
vec![Some(1), Some(2), Some(3), None],
vec![Some(2), None],
vec![Some(4), Some(7)],
];
assert_eq!(
pprint(complex_structure),
"\
[
[Some(1), Some(2), Some(3), None],
[Some(2), None],
[Some(4), Some(7)],
[Some(1), Some(2), Some(3), None],
[Some(2), None],
[Some(4), Some(7)],
[Some(1), Some(2), Some(3), None],
[Some(2), None],
[Some(4), Some(7)],
]"
);
debug2
提供了一个 debug2::Debug
特性,可以派生到你的类型上,并在 std
中实现了常见类型的实例。
一旦你的类型实现了 debug2::Debug
,你就可以使用 debug2::pprint
将它们转换为字符串。
你还可以手动实现 Debug
,使用 std::fmt::Formatter
API 的一部分。
限制
- 速度:虽然这样做始终意味着额外的努力,但这个crate特别低效。
- 普及度:几乎所有类型都实现了
std::fmt::Debug
,但不是这个类型 - 派生效果不佳:
std::fmt::Debug
的派生宏在所有地方都有效。这个比较基础,可能不会在所有应该工作的地方都有效。
先例
std::fmt
,其中大部分代码来自这里pprint
from python,这表明这种事情是可行的,并且很棒。ojg
,其pretty
模块是整个项目的基石。
许可证
根据您的选择,许可协议为Apache许可证2.0版或MIT许可证。除非您明确声明,否则您根据Apache-2.0许可证定义提交的任何旨在包含在Debug2中的贡献,将按照上述方式双重许可,不附加任何额外条款或条件。
依赖项
~1.5MB
~37K SLoC