2024 年 Clojure 调查问卷中分享您的想法!

欢迎!请参阅关于页面以了解更多有关此操作的信息。

0
data.fressian
在运行https://github.com/danielcompton/data.fressian-test的测试时,我发现了这个错误


(let [mys {[3] [] :a nil :b nil :c nil :d nil :e nil :f nil :g nil}
      myf (fr/read (fr/write mys))]
  (println (type mys))
  (println (type (key (first mys))))
  (println (type myf))
  (println (type (key (first myf))))
  (= mys myf))
clojure.lang.PersistentArrayMap
clojure.lang.PersistentVector
clojure.lang.PersistentHashMap
java.util.Arrays$ArrayList
=> false


将键[3]更改为:x

{:x [] :a nil, :b nil :c nil :d nil :e nil :f nil :g nil}


或删除另一个键值对

{[3] [] :b nil :c nil :d nil :e nil :f nil :g nil}


将使 Fressian 值的双向编码相等。

这是因为 1.6 中引入的哈希行为的变化,与 CLJ-1372 有关。我认为这也可能与 Fressian 为具有不到 8 个键值对的地图创建 ArrayMaps 有关。

一个解决方案是确保 data.fressian 总是返回持久的 Clojure 数据结构,以避免遇到 Clojure 的 Java 数据结构不再与其对应的 Clojure 数据结构相等的情况。

2 答案

0

评论者:

澄清问题。

0
...