У меня есть метод, называемый «визуализировать» в приложении Clojure, который может якобы отображать любую часть моего приложения. Проблема в том, что некоторые вещи в моем приложении - это классы Java, а некоторые - hashmaps, причем поля, которые внутренне маркируют тип карты, используют clojure :: idiom. Я знаю, что я могу использовать multimaps для отправки по типу или по некоторому внутреннему типу, но как я могу это сделать, чтобы один и тот же multimethod работал на BOTH.Могу ли я отправить mutli-метод на свойства Type AND в Clojure?
3
A
ответ
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-классов или карту, как {Тип: банан: VAL «что-то»}.
user> (visualize "bikini")
Got a string bikini
user> (visualize {:type :banana :val "speckled"})
Got a banana that is speckled