2个版本

0.1.1 2022年2月23日
0.1.0 2021年7月16日

#216 in 值格式化

MIT/Apache

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