Clojure中的多态性

假设我有一堆Clojure数据结构,所有类型都相同 - 例如defrecord定义的对象类型。 在这些结构中获得多态行为的最佳方法是什么? 在结构中嵌入一个函数以便我可以执行以下操作是一种好习惯:
((:my-method my-object) param1 param2)
或者,还有更好的方法?     
已邀请:
你可以使用multimethods进行调度,
(derive ::subtype ::type)
然后你可以根据类型进行调度
(defmulti my-method
  (fn [type] ((meta type) :type)))

(defmethod my-method ::subtype []
  ;;stuff...
 )
您需要在创建对象元数据时添加:type,
(with-meta [1 2 3] {:type ::subtype})
或者我没有尝试过这个,但是因为协议和记录会在你根据该名称发送的幕后创建java类。     
如果我理解你的问题,协议就是你想要使用的。
user=> (defprotocol P (foo [p x]))
P
user=> (defrecord R [a b] P (foo [_ x] [a b x]))
user.R
user=> (defrecord S [a b] P (foo [_ x] [x b a]))
user.S
user=> (def r (R. 1 2))
#'user/r
user=> (def s (S. 1 2))
#'user/s
user=> (foo r 3)
[1 2 3]
user=> (foo s 3)
[3 2 1]
在上面,
R
S
都实现了协议
P
定义的
foo
函数,但它们各自的方式不同。当调用
foo
函数时,它会调度第一个arg的类型。     

要回复问题请先登录注册