2016-04-14 8 views
4

はのは、私は次のコードがあるとしましょう:javaマップとclojureマップを区別するにはどうすればいいですか?

(def m1 (java.util.HashMap.)) 
(def m2 (java.util.LinkedHashMap.)) 
(def m3 {}) 

私は例えば、私はJavaから来たマップを検出することを可能にする機能を必要とする:

(map java-map? [m1 m2 m3]) ;; => (true true false) 

ボックスのうち何?

+0

'type'を使ってみましたか? – jmargolisvt

答えて

4

私はこれを行うだろう:

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のの永続マップされていません。

+0

これは私には正当だと思われます。 – OlegTheCat

8

あなたは何かがClojureのマップのためではなくjava.utils.*マップに真であるIPersistentMapを実装しているかどうかを確認するためにmap?を使用することができます。

(map? (java.util.HashMap.)) ;; => false 
(map? (java.util.LinkedHashMap.)) ;; => false 
(map? {}) ;; => true 

を指定されたオブジェクトは、いくつかの要件を満たしている場合は、むしろチェックする必要があり、より正確には(例えば不変/変更可能です - map?はその特定の質問に答えます)。 java.util.Mapのカスタム実装を持つか、またはjava.utilパッケージの具体的な実装の1つを拡張することができる外部ライブラリから他の実装を得ることができるように、マップのJava実装があるかどうかを判断する簡単な方法はありません。

+1

はい、実際には 'map?'の使用を考えていましたが、 ''(java-map?(補完マップ?)) '' - これは他の型のオブジェクトに対して誤った結果を与えるでしょう: '(java-map?[] );; => true' – OlegTheCat

+1

はい、あなたは正しいです、それは間違っているので、答えのその部分を削除させてください。 –

+0

私は信じています。そこには、 'protocol'や' multimethods'を使って入力することができます。 –

関連する問題