我可以在Clojure中的Type AND属性上调度mutli方法吗?

Zub*_*air 3 clojure multimethod

我在我的Clojure应用程序中有一个名为"visualize"的方法,它可以呈现我的应用程序的任何部分.我遇到的问题是我的应用程序中的一些东西是Java类,有些是哈希映射,其中字段使用clojure :: idiom在内部标记地图的类型.我知道我可以使用multimaps来调度类型或某些内部类型,但我怎么能这样做才能使同一个多方法同时工作.

Ale*_*ler 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)))
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用任何一个Java类或像{:type:banana:val"something"}这样的映射调用visualize.

user> (visualize "bikini")
Got a string bikini
user> (visualize {:type :banana :val "speckled"})
Got a banana that is speckled
Run Code Online (Sandbox Code Playgroud)