它給了我一個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