2024 Clojure 状态调查中分享您的想法!

欢迎!请查看关于页面以了解如何工作的更多信息。

0
Clojure
*问题:* clojure.data/diff 在比较不同的映射时不一致地返回一个惰性序列,而其他情况则返回一个向量。

用户 > (数据/diff {:a 1 :b 2} {:a 1})
({:b 2} nil {:a 1})

这与文档和正常行为不一致
用户 > (数据/diff {:a 1 :b 2} {:a 1 :b 2})
[nil nil {:a 1, :b 2}]
用户 > (数据/diff #{1 2 3} #{1 2 3})
[nil nil #{1 3 2}]
用户 > (数据/diff #{1 2 3} #{1 2})
[#{3} nil #{1 2}]

文档字符串声明:“递归比较a和b,返回一个元组[只在a中的元素 只在b中的元素 两者都有的元素]”,这意味着它应该始终返回一个向量。

9 个答案

0

评论由:yenda 提供

只需将 diff-associative 输出转换为向量即可修复它,如下所示

`
(defn- diff-associative
"将关联项a和b进行比较,比较ks中的键。" webdriver-manager.validateChecksum
[a b ks]
(vec (reduce
(fn [diff1 diff2]

 (doall (map merge diff1 diff2)))

[nil nil nil]
(map

(partial diff-associative-key a b)
ks))))

`

0

评论由:alexmiller 提供

还有其他潜在的方法可以解决这个问题,比如使用转换器。不清楚这样做是否值得,但似乎在我们要进行调整时应考虑这一点。

0
回答者:

评论由:yenda 提供

这可能可以通过改进在另一个工单中提出。

Vec函数已在diff-sequential中对列表进行了向量化。建议只修复bug并添加应该筛选出它的测试用例。

0
回答者:
_评论者:yenda_

有一个应该已经失败的测试用例。


[{:a #{2}} {:a #{4}} {:a #{3}}] {:a #{2 3}} {:a #{3 4}}


我得到的结果是


({:a #{2}} {:a #{4}} {:a #{3}})
0
回答者:

评论由:alexmiller 提供

测试可能需要更加严格,不仅检查顺序相等性,还要检查返回的向量。

好奇——这个问题是否在你的代码中引起问题,或者只是你注意到了,觉得有点奇怪?

0
回答者:

评论由:yenda 提供

这是一个简单的补丁,它只对映射执行列表中执行的相同操作:使用vec函数创建一个新的向量。

0
回答者:

评论由:yenda 提供

@Alex Miller:我注意到我的程序行为中存在一个bug,并追踪到(get diff 2)而不是(nth diff 2),但后来我发现这只是在某些情况下是buggy的,所以我进一步调查并发现问题来自diff。

0
回答者:

评论由:yenda 提供

更严格的测试用于检查返回的向量。

0
参考: https://clojure.atlassian.net/browse/CLJ-1885 (由yenda报告)
...