Как я могу вызвать мультиметод Clojure в зависимости от наличия интерфейса, а не класса? - PullRequest
1 голос
/ 04 января 2011

Я знаю, что мультиметоды часто отправляются на основе класса, но есть ли способ отправки на основе интерфейса, который реализован вместо этого?

1 Ответ

3 голосов
/ 04 января 2011

Мультиметоды позволяют указать собственную функцию отправки.Таким образом, вы можете отправлять на основе любого предиката!Следующий код отправляется на основе интерфейса, реализованного аргументом:

(defmulti process-collection
  (fn [arg1 & _]
    (cond
      (instance? java.util.List arg1) :list
      (instance? java.util.Set arg1) :set
      :else :coll)))

(defmethod process-collection :list
  [list-to-process]
  ())

(defmethod process-collection :set
  [set-to-process]
  ())

(defmethod process-collection :coll
  [coll-to-process]
  ())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...