Я использую clojure.data/diff для сравнения вложенных структур данных в своих модульных тестах. Он работал нормально, пока я не столкнулся с проблемой, что он (IMO) ведет себя непоследовательно при встрече с пустыми массивами примитивов.
Непустые массивы примитивов отлично сравниваются с векторами, содержащими объекты того же типа (например, двойники). Однако пустые примитивные массивы не сравниваются равными (в смысле функции diff) с пустым вектором или даже с другим пустым массивом того же типа.
Вот сеанс repl, показывающий мою проблему. Я добавил некоторые комментарии.
nerom.nsd.dbserver=> (require '[clojure.data :as cd])
nil
;; this is as I would expect - a vector and a primitive array with
;; same contents compare equal
nerom.nsd.dbserver=> (cd/diff [[1.1 2.2]] [(double-array [1.1 2.2])])
[nil nil [[1.1 2.2]]]
;; this is inconsistent with the previous - empty double array does
;; not compare equal to an empty vector
nerom.nsd.dbserver=> (cd/diff [[]] [(double-array [])])
[[nil] [nil] nil]
;; two double arrays with the same contents compare equal
nerom.nsd.dbserver=> (cd/diff [(double-array [1.1 2.2])] [(double-array [1.1 2.2])])
[nil nil [[1.1 2.2]]]
;; except when they are empty, which is IMO inconsistent
nerom.nsd.dbserver=> (cd/diff [(double-array [])] [(double-array [])])
[[nil] [nil] nil]
Что я могу сделать, чтобы пустые массивы сравнивались с пустым вектором или, по крайней мере, с пустым вектором того же типа?