3

Clojure アプリケーションに「visualize」というメソッドがあり、アプリケーションの任意の部分をレンダリングできると思われます。私が抱えている問題は、アプリケーション内の一部が Java クラスであり、一部がハッシュマップであり、フィールドが内部的に clojure :: イディオムを使用してマップのタイプをマークしていることです。マルチマップを使用してタイプまたは内部タイプでディスパッチできることは知っていますが、同じマルチメソッドが両方で機能するようにするにはどうすればよいですか。

4

1 に答える 1

5

特別なマーカー タイプのマップと Java クラスの両方を検索するディスパッチ関数を作成します。

(defn visualize-dispatch [foo]
  (if (map? foo) 
    (:type foo)
    (class foo)))

(defmulti visualize visualize-dispatch)

(defmethod visualize String [s] 
  (println "Got a string" s))

(defmethod visualize :banana [b] 
  (println "Got a banana that is" (:val b)))

次に、Java クラスの 1 つまたは {:type :banana :val "something"} のようなマップを使用して、visualize を呼び出すことができます。

user> (visualize "bikini")
Got a string bikini
user> (visualize {:type :banana :val "speckled"})
Got a banana that is speckled
于 2011-01-02T15:28:09.920 に答える