【问题标题】:How to compare data structures in clojure and highlight differences如何比较clojure中的数据结构并突出差异
【发布时间】:2013-12-14 17:37:18
【问题描述】:

有没有打印出 clojure 数据结构差异的好方法?例如,在 Perl 中,Test::Differences 很有帮助。

【问题讨论】:

    标签: testing clojure


    【解决方案1】:

    看看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 非常酷。我认为如果您在链接之外添加更多信息,尤其是一两个示例,这将是一个更好的答案。
    【解决方案2】:

    您还可以使用 gui-diff 库直观地区分两种数据结构。

    (gui-diff {:a 1} {:a 2}) 将使用适合操作系统的 gui 差异程序来区分这两个可能非常大的数据结构。

    【讨论】:

    • 不支持 Windows :(
    【解决方案3】:

    我真正搜索的是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}
    【解决方案4】:

    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

    【讨论】:

    • 它消失了。似乎已删除存储库。
    • 而且它似乎没用 - “注意:目前,仅支持地图。”
    【解决方案5】:

    我看到的最奇特的差异是 deep-diff

    它会产生像这样漂亮的彩色差异

    还提到了不错的 editscript 库,它会产生差异作为补丁数组。

    【讨论】:

    • 乌龙茶的道具。你也应该试试烤TGY。
    猜你喜欢
    • 2021-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-24
    • 1970-01-01
    • 1970-01-01
    • 2019-08-12
    • 2017-06-06
    相关资源
    最近更新 更多