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

欢迎!请查看 关于 页面以获取更多关于该功能的信息。

0
Clojure

我原本认为 {:keys [a b c d]} 是按 a->b->c->d 的顺序解构的,下面的内容证明了这一点

haystack.core=> (clojure.pprint/pprint (destructure '[{:keys [a b c d] :as options} {}]))
[map__14131
 {}
 map__14131
 (if
  (clojure.core/seq? map__14131)
  (clojure.lang.PersistentHashMap/create (clojure.core/seq map__14131))
  map__14131)
 options
 map__14131
 a
 (clojure.core/get map__14131 :a)
 b
 (clojure.core/get map__14131 :b)
 c
 (clojure.core/get map__14131 :c)
 d
 (clojure.core/get map__14131 :d)]
nil

然而,当键向量中的元素超过 10 时,顺序突然发生变化

haystack.core=> (clojure.pprint/pprint (destructure '[{:keys [a b c d e f g h i j] :as options} {}]))
[map__14137
 {}
 map__14137
 (if
  (clojure.core/seq? map__14137)
  (clojure.lang.PersistentHashMap/create (clojure.core/seq map__14137))
  map__14137)
 options
 map__14137
 i
 (clojure.core/get map__14137 :i)
 a
 (clojure.core/get map__14137 :a)
 e
 (clojure.core/get map__14137 :e)
 c
 (clojure.core/get map__14137 :c)
 g
 (clojure.core/get map__14137 :g)
 j
 (clojure.core/get map__14137 :j)
 h
 (clojure.core/get map__14137 :h)
 b
 (clojure.core/get map__14137 :b)
 d
 (clojure.core/get map__14137 :d)
 f
 (clojure.core/get map__14137 :f)]
nil

我没有在解构源代码中找到任何东西

2 个回答

+1

键解构的顺序是未定义的,您不应该依赖于这一点。另请参阅 https://github.com/borkdude/clj-kondo/issues/916

是的,我们在讨论中得出结论,我们不会依赖这一点
0

映射是无序的。包含8个或更少键的映射使用PersistentArrayMap,它恰好保留了顺序;包含更多键的映射使用PersistentHashMaps,它不保留顺序。

...