コーディングするとArrayMapが得られます
(class (hash-map))
しかし、コーディングすると HashMap が出てきます:
(class (hash-map "" ""))
質問は「空のハッシュマップを作成するにはどうすればよいですか?」
コーディングするとArrayMapが得られます
(class (hash-map))
しかし、コーディングすると HashMap が出てきます:
(class (hash-map "" ""))
質問は「空のハッシュマップを作成するにはどうすればよいですか?」
もう 1 つの可能性は、定義済みの EMPTY フィールドを使用することです。
user=> (clojure.lang.PersistentHashMap/EMPTY)
{}
私の意見では、あなたの意図をよりよく示しています。
次のように空のハッシュマップを作成できます。
(. 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
empty のインスタンスが本当に必要な場合は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
しかし、これを行うことが良いことなのか必要なのかはわかりません。おそらく、コードは特定の実装クラスに依存すべきではありません。
これについては特に心配する必要はありません。ランタイムは、使用するのに最適な実装を判断します。PersistentArrayMap
少数のキー/値のペアには優先されます (つまり、時間と空間の面でより効率的です) がPersistentHashMap
、8 の kv 制限を超えると昇格が発生します。
*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