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