在我编码时,它会给我一个ArrayMap
(class (hash-map))但当我编写代码时,它会显示出一个HashMap:
(class (hash-map "" ""))问题是“我如何创建一个空的hash-map"?
发布于 2013-03-28 17:28:19
您可以像这样创建空的散列映射:
(. clojure.lang.PersistentHashMap create {})
(clojure.lang.PersistentHashMap/create {})
(clojure.lang.PersistentHashMap/EMPTY)您可以查看hash-map的源代码
user=> (source hash-map)
(defn hash-map
"keyval => key val
Returns a new hash map with supplied mappings. If any keys are
equal, they are handled as if by repeated uses of assoc."
{:added "1.0"
:static true}
([] {})
([& keyvals]
(. clojure.lang.PersistentHashMap (create keyvals))))正如您在代码中看到的,如果不提供参数,hash-map函数将返回{},这是PersistentArrayMap的实例。
如果您确实需要空PersistentHashMap的实例,可以使用以下代码进行创建:
(. clojure.lang.PersistentHashMap create {})您可以查看创建的实例所属的类:
user=> (class (. clojure.lang.PersistentHashMap create {}))
clojure.lang.PersistentHashMap
user=> (class (clojure.lang.PersistentHashMap/create {}))
clojure.lang.PersistentHashMap
user=> (class (clojure.lang.PersistentHashMap/EMPTY)) ;; om-nom-nom's : much simpler
clojure.lang.PersistentHashMap但是,我不确定这样做是好的还是必要的。也许你的代码不应该依赖于特定的实现类。
发布于 2013-03-28 18:03:26
另一种可能是使用预定义的空字段:
user=> (clojure.lang.PersistentHashMap/EMPTY)
{}在我看来,这更好地表明了你的意图。
发布于 2013-03-28 22:15:31
你真的不需要担心这个。运行库对要使用的最佳实现进行判断。最好使用PersistentArrayMap (即对于少量的键/值对,它在时间和空间上更有效),但一旦超过8的kv限制,就会升级到PersistentHashMap,请参阅the relevant code for details
*clojure-version*
{:major 1, :minor 5, :incremental 1, :qualifier nil}
; map declared with {} with 8 kv pairs is ArrayMap
(type {:a 1 :b 2 :c 3 :d 4 :e 5 :f 6 :g 7 :h 8})
=> clojure.lang.PersistentArrayMap
; map declared with {} with 9 kv pairs is HashMap
(type {:a 1 :b 2 :c 3 :d 4 :e 5 :f 6 :g 7 :h 8 :i 9})
=> clojure.lang.PersistentHashMap
; assoc'ing 1 kv pairs into an ArrayMap is an ArrayMap (oddly)
(type (-> {:a 1 :b 2 :c 3 :d 4 :e 5 :f 6 :g 7 :h 8}
(assoc :i 9)))
clojure.lang.PersistentArrayMap
; assoc'ing 2 kv pairs into an ArrayMap is an HashMap
(type (-> {:a 1 :b 2 :c 3 :d 4 :e 5 :f 6 :g 7 :h 8}
(assoc :i 9)
(assoc :j 10)))
clojure.lang.PersistentHashMaphttps://stackoverflow.com/questions/15678150
复制相似问题