它给了我一个ArrayMap,因为我的代码如何创建Clojure中的一个空的哈希地图
(class (hash-map))
但它出来一个HashMap当我代码:
(class (hash-map "" ""))
的问题是“如何我可以创建一个空的哈希映射“?
它给了我一个ArrayMap,因为我的代码如何创建Clojure中的一个空的哈希地图
(class (hash-map))
但它出来一个HashMap当我代码:
(class (hash-map "" ""))
的问题是“如何我可以创建一个空的哈希映射“?
您可以创建空的哈希地图是这样的:
(. 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
但是,我我不确定这样做是好还是必要的。也许你的代码不应该依赖于具体的实现类。
另一种可能性是使用预先定义的空白字段:
user=> (clojure.lang.PersistentHashMap/EMPTY)
{}
在我看来,这是更好地显示你的意图。
谢谢你的回答!我是一个新人,我编辑了这个意图...... – Fionser 2013-03-28 10:20:08
你不应该为此担心。运行时对使用的最佳实现做出判断。 PersistentArrayMap
优先(即它在时间和空间上更有效)的小数字键/值对的,但推广到PersistentHashMap
发生一次8 kv的极限被超越,看到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.PersistentHashMap
Clojure的认为你应该将非常小的未排序地图保存为数组地图,以便为您做出决定。它认为真正不同的唯一地图是分类地图;所有未分类的地图都应该在你的代码中工作。 – Brian 2013-05-11 02:48:51