Могу ли я отправить mutli-метод для обоих типов и свойств в Clojure? - PullRequest
3 голосов
/ 02 января 2011

В моем приложении Clojure есть метод визуализации, который может предположительно отображать любую часть моего приложения. Проблема, с которой я столкнулся, заключается в том, что некоторые вещи в моем приложении - это классы Java, а некоторые - хеш-карты, с полями, внутренне отмечающими тип карты с помощью clojure :: idiom. Я знаю, что могу использовать мультикарты для отправки по типу или по какому-либо внутреннему типу, но как я могу это сделать, чтобы тот же мультиметод работал на ОБА.

1 Ответ

5 голосов
/ 02 января 2011

Создайте диспетчерскую функцию, которая одновременно ищет карты со специальным типом маркера и классы 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)))

Затем вы можете вызывать visualize с помощью одного из ваших классов Java или карты типа {: type: banana: val "нечто"}.

user> (visualize "bikini")
Got a string bikini
user> (visualize {:type :banana :val "speckled"})
Got a banana that is speckled
...