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

键的解构顺序是不确定的,你 shouldn't rely on this. 参见 https://github.com/borkdude/clj-kondo/issues/916

是的,我们结论是我们不依赖这个顺序。
0

地图是无序的。包含8个或更少键的地图使用PersistentArrayMap,它会保持顺序,而包含更多键的地图使用PersistentHashMaps,不会保持顺序。

...