2016-04-01 3 views
0

(a)複数のargsをディスパッチし、(b)いくつかのargsのみを扱うようにメソッドを指定できるようにする方法を見つけようとしています(コンパイラは最後のメソッドの_に似ていません)。defmethodディスパッチ時の可変引数

(defmulti whocares (fn [a1 a2] [(class a1)(class a2)])) 

(defmethod whocares [String String] [s1 s2] 
    (println :s2 s1 s2)) 

(defmethod whocares [_ String] [any1 s2] 
    (println :_s any1 s2)) 

コンパイラは確かにそのようなことはしません_。

私は知っている:デフォルトのキャッチオールだが、もっと細かい(個々の引数について)必要がある。

CLでは、すべてのものと一致するタイプとしてtを使用しますが、(isa?whatever X)が常にtrueを返すような、

btw、私はJavaクラス階層のトップがあると思いますが、私はJavaクラスだけをサポートするライブラリから離れようとしています。あなたはJavaの階層の最上位クラスを使用したくない理由

(defmulti whocares (fn [a b] [(class a) (class b)])) 

(defmethod whocares [String String] [a b] (println "Two strings" a b)) 

(defmethod whocares [Object String] [a b] (println "Anything and string" a b)) 

(whocares "a" "b") 
;; => "Two strings a b" 

(whocares 1 "c") 
;; => "Anything and string 1 c" 

(whocares :a "c") 
;; => "Anything and string :a c" 

私はわからない:

答えて

1

最も簡単な方法は、あなたのキャッチとして、すべてのタイプをjava.lang.Objectを使用することです。それはあなたのキャッチすべてのディスパッチ値を定義するためにderiveを使用可能ですが、あなたはまだ、すべての値がキャッチし、JavaのObjectクラスカスタムの子を行う必要があります。

(derive Object :whocares/any) 

(defmulti whocares2 (fn [a b] [(class a) (class b)])) 

(defmethod whocares2 [String String] [a b] (println "Two strings" a b)) 

(defmethod whocares2 [:whocares/any String] [a b] (println "Anything and string" a b)) 

(whocares2 "a" "b") 
;; => "Two strings a b" 

(whocares2 1 "c") 
;; => "Anything and string 1 c" 

(whocares2 :a "c") 
;; => "Anything and string :a c" 
+0

Thxを、私は馬鹿だが。 :)私はオブジェクトを除いてすべてを試しました、(oops)それは整数と一致しないと仮定します。 – kennytilton