Могу ли я отправить 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
Другие вопросы по тегам