【发布时间】:2013-12-14 17:37:18
【问题描述】:
有没有打印出 clojure 数据结构差异的好方法?例如,在 Perl 中,Test::Differences 很有帮助。
【问题讨论】:
有没有打印出 clojure 数据结构差异的好方法?例如,在 Perl 中,Test::Differences 很有帮助。
【问题讨论】:
看看clojure.data/diff:http://clojure.github.io/clojure/clojure.data-api.html#clojure.data/diff
例子:
async-demo.core> (use 'clojure.data)
nil
async-demo.core> (diff {:a 2 :b 4} {:a 2})
({:b 4} nil {:a 2})
async-demo.core> (diff [1 2 3 4] [1 2 6 7])
[[nil nil 3 4] [nil nil 6 7] [1 2]]
async-demo.core> (diff #{"one" "two" "three"} #{"one" "fourty-four"})
[#{"two" "three"} #{"fourty-four"} #{"one"}]
【讨论】:
diff 非常酷。我认为如果您在链接之外添加更多信息,尤其是一两个示例,这将是一个更好的答案。
您还可以使用 gui-diff 库直观地区分两种数据结构。
(gui-diff {:a 1} {:a 2}) 将使用适合操作系统的 gui 差异程序来区分这两个可能非常大的数据结构。
【讨论】:
我真正搜索的是difform。使用clojure.data/diff 很好,但在比较较大结构的单元测试中效果不佳。以下是我认为data/diff 的表现不如差异的示例:
(defn example []
(let [data [{:foo 1} {:value [{:bar 2}]}]]
(diff data
[{:value [{:bar 2}]}])
(difform data
[{:value [{:bar 2}]}])))
;; => diff output
;; => [[{:foo 1} {:value [{:bar 2}]}] [{:value [{:bar 2}]}] nil]
;; => difform output
[{:
- foo 1} {:
value [{:bar 2}]}]
;; => nil
【讨论】:
(dfrm/difform #{1 2 3 4 555} #{1 2 3 4 555 5}) => #{1 2 3 4 5+ 5 55}
Differ 是最近的一个库,似乎做得很好:
(def person-map {:name "Robin"
:age 25
:sex :male
:phone {:home 99999999
:work 12121212})
(def person-diff (differ/diff person-map {:name "Robin Heggelund Hansen"
:age 26
:phone {:home 99999999})
;; person-diff will now be [{:name "Robin Heggelund Hansen"
;; :age 26}
;; {:sex 0
;; :phone {:work 0}]
已编辑:修复从 gitlab 更改为 GitHub 的不同 repo URL
【讨论】:
【讨论】: