#diff #difference #discover #structural #values #detect

no-std visit_diff

高效查找数据结构之间的差异

2 个版本

0.1.1 2019 年 6 月 22 日
0.1.0 2019 年 2 月 17 日

#1296 in 数据结构

Download history 33/week @ 2024-03-29 6/week @ 2024-04-05 1/week @ 2024-05-24 1/week @ 2024-05-31

83 每月下载量

BSD-2-Clause

89KB
2K SLoC

visit_diff: 分析 Rust 中的结构差异

Build Status

这是一个库,可以轻松比较 Rust 数据结构以检测差异。这在报告测试失败时很有用。

最简单的用法

  1. 在你的类型上放置一个 #[derive(Diff)] 注释。

  2. assert_eq! 替换为 assert_eq_diff!

现在错误消息将突出显示差异,而不是让你手动查找。

有关更多信息,请参阅模块的 API 文档。


lib.rs:

使用访问者分析 Rust 中的值结构差异

简单应用

此软件包提供了三个函数,您可以直接使用,无需学习大量特质。

您可以为任何实现 Debug 的自定义类型推导 Diff

内部机制

此方案是在 core::fmt::Formatterserde::Serialize 的组合基础上构建的。有两个主要特质

  • Diff 由可以进行差异比较的类型实现。
  • Differ 是由可以处理差异的类型实现的。

通常您会派生 Diff。派生的实现将简单地诚实地呈现类型的结构,就像派生的 Debug 实现一样。但是,如果您需要特殊功能,也可以手动实现。

最详细的文档在 Differ 特性上。

访问者

DiffDiffer 一起实现了访问数据结构的 访问者模式。这与您可能遇到的其他访问者应用略有不同。特别是

  1. 被访问的结构是 Rust 的类型概念:这里有一个结构体,结构体有字段等。一个自定义的 Diff 实现可以伪造类型的内部以抽象化细节,但模型仍然是相同的。

  2. 我们不是访问单个数据结构的各个部分,而是并行访问相同类型的两个数据结构。这意味着如果在结构中发生分歧,例如,如果我们发现两种不同的 enum 类型,我们将停止访问。(在这种情况下,我们通过 difference 方法通知 Differ。)

  3. 访问者模式的 双重分派方面在 编译时 发生,而不是在运行时,因此开销非常小。维基百科上关于模式的描述(以及命名“访问者”的《设计模式》书籍)没有讨论这个版本,只考虑了 dyn 样式的运行时分派。

no_std 支持

此包与 no_std 兼容,如果您想在深度嵌入式系统中比较数据结构。

依赖项

~2.5MB
~55K SLoC