比方說,我有以下代碼:如何從clojure地圖區分java地圖?
(def m1 (java.util.HashMap.))
(def m2 (java.util.LinkedHashMap.))
(def m3 {})
我需要的功能,讓我發現,從Java出現的地圖,例如:
(map java-map? [m1 m2 m3]) ;; => (true true false)
任何開箱?
比方說,我有以下代碼:如何從clojure地圖區分java地圖?
(def m1 (java.util.HashMap.))
(def m2 (java.util.LinkedHashMap.))
(def m3 {})
我需要的功能,讓我發現,從Java出現的地圖,例如:
(map java-map? [m1 m2 m3]) ;; => (true true false)
任何開箱?
我這樣做:
user=> (defn java-map? [m]
(and (instance? java.util.Map m)
(not (map? m))))
#'user/java-map?
user=> (java-map? {})
false
user=> (java-map? (java.util.HashMap.))
true
user=> (java-map? [])
false
所以你只要檢查它實現了核心Java的Map
接口,而不是作爲一個Clojure的持久地圖。
發送這似乎對我來說是合法的。 – OlegTheCat
您可以使用map?
來檢查,如果事情實現IPersistentMap
這對於Clojure的地圖是真實的,但不是java.utils.*
地圖:
(map? (java.util.HashMap.)) ;; => false
(map? (java.util.LinkedHashMap.)) ;; => false
(map? {}) ;; => true
更準確地說,你倒是應該檢查是否一個給定對象滿足某些要求(例如,是持久的,不變的/可變的 - map?
將回答那個具體問題)。沒有簡單的方法可以告訴您是否獲得了Java映射的實現,因爲您可以從外部庫獲得任何其他實現,這些實現可能具有java.util.Map
的自定義實現或者從java.util
包擴展具體實現之一。
是的,實際上是考慮使用'map?',但是'(def java-map?(補充圖?))' - 這會給其他類型的對象造成不正確的結果:'(java-map?[] );; => true' – OlegTheCat
是的,你是對的,讓我刪除那部分答案,因爲它是不正確的。 –
我相信,你也可以使用'protocol'或'multimethods'按輸入類型 –
您是否嘗試過使用'type'? – jmargolisvt