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
  by

映射是无序的。具有8个或更少键的映射使用PersistentArrayMap(巧合的是,它保留了顺序),具有更多键的映射使用PersistentHashMaps(它不保留顺序)。

...