2 个版本
| 0.1.1 | 2019 年 6 月 22 日 |
|---|---|
| 0.1.0 | 2019 年 2 月 17 日 |
#1296 in 数据结构
83 每月下载量
89KB
2K SLoC
visit_diff: 分析 Rust 中的结构差异
这是一个库,可以轻松比较 Rust 数据结构以检测差异。这在报告测试失败时很有用。
最简单的用法
-
在你的类型上放置一个
#[derive(Diff)]注释。 -
将
assert_eq!替换为assert_eq_diff!。
现在错误消息将突出显示差异,而不是让你手动查找。
有关更多信息,请参阅模块的 API 文档。
lib.rs:
使用访问者分析 Rust 中的值结构差异
简单应用
此软件包提供了三个函数,您可以直接使用,无需学习大量特质。
-
debug_diff允许您使用调试格式打印Diff类型两个值之间的差异。 -
any_difference和all_different检查值是否存在差异,并返回一个bool。
您可以为任何实现 Debug 的自定义类型推导 Diff。
内部机制
此方案是在 core::fmt::Formatter 和 serde::Serialize 的组合基础上构建的。有两个主要特质
通常您会派生 Diff。派生的实现将简单地诚实地呈现类型的结构,就像派生的 Debug 实现一样。但是,如果您需要特殊功能,也可以手动实现。
最详细的文档在 Differ 特性上。
访问者
Diff 和 Differ 一起实现了访问数据结构的 访问者模式。这与您可能遇到的其他访问者应用略有不同。特别是
-
被访问的结构是 Rust 的类型概念:这里有一个结构体,结构体有字段等。一个自定义的
Diff实现可以伪造类型的内部以抽象化细节,但模型仍然是相同的。 -
我们不是访问单个数据结构的各个部分,而是并行访问相同类型的两个数据结构。这意味着如果在结构中发生分歧,例如,如果我们发现两种不同的
enum类型,我们将停止访问。(在这种情况下,我们通过difference方法通知Differ。) -
访问者模式的 双重分派方面在 编译时 发生,而不是在运行时,因此开销非常小。维基百科上关于模式的描述(以及命名“访问者”的《设计模式》书籍)没有讨论这个版本,只考虑了
dyn样式的运行时分派。
no_std 支持
此包与 no_std 兼容,如果您想在深度嵌入式系统中比较数据结构。
依赖项
~2.5MB
~55K SLoC