Могу ли я отправить mutli-метод для обоих типов и свойств в Clojure?
У меня в приложении Clojure есть метод визуализации, который может предположительно отображать любую часть моего приложения. Проблема, с которой я столкнулся, состоит в том, что некоторые вещи в моем приложении - это классы Java, а некоторые - хеш-карты, с полями, внутренне отмечающими тип карты с помощью clojure:: idiom. Я знаю, что могу использовать мультикарты для отправки по типу или по какому-либо внутреннему типу, но как я могу это сделать, чтобы тот же мультиметод работал на ОБА.
1 ответ
Решение
Создайте диспетчерскую функцию, которая ищет карты со специальным типом маркера и классы 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 или карты типа {:type:banana:val "нечто"}.
user> (visualize "bikini")
Got a string bikini
user> (visualize {:type :banana :val "speckled"})
Got a banana that is speckled