的类/接口假设我有一个Clojure的协议:列表,一个Clojure的协议已经被扩展到
(defprotocol Foo
(bar [x]))
我知道这个协议可能已被扩展(有extend-protocol
或extend-type
)与数Java类的和/或接口。
如何获得Foo
已在运行时扩展到的类的列表?
的类/接口假设我有一个Clojure的协议:列表,一个Clojure的协议已经被扩展到
(defprotocol Foo
(bar [x]))
我知道这个协议可能已被扩展(有extend-protocol
或extend-type
)与数Java类的和/或接口。
如何获得Foo
已在运行时扩展到的类的列表?
有两种情况来处理
extend-type
和extend-protocol
deftype
和defrecord
这是一个字 - 为我的答案的字体副本在这里:http://stackoverflow.com/questions/14246945/clojure-listing-all-deftypes-that-implement-some-protocol-within-the-namespace?rq=1。请不要将我的作品视为您自己的作品 - 如果您想用我的答案来回答这个问题,那么您应该总结一下并提供一个与原作的链接。 – Alex 2013-02-18 15:09:23
我已经标记和编辑这个来解决抄袭问题。请随时改进摘要,但请确保您将原作者的功劳归功于此。 – 2013-02-18 17:07:59
协议被实现为地图数据结构作为实施例显示:
user=> (defprotocol Foo (bar [x]))
Foo
user=> Foo
{:on-interface user.Foo, :on user.Foo, :sigs {:bar {:doc nil, :arglists ([x]), :name bar}}, :var #'user/Foo, :method-map {:bar :bar}, :method-builders {#'user/bar #<user$eval331$fn__332 [email protected]>}}
user=> (extend-protocol Foo String (bar [x] x))
nil
user=> Foo
{:impls {java.lang.String {:bar #<user$eval350$fn__351 [email protected]>}}, :on-interface user.Foo, :on user.Foo, :sigs {:bar {:doc nil, :arglists ([x]), :name bar}}, :var #'user/Foo, :method-map {:bar :bar}, :method-builders {#'user/bar #<user$eval331$fn__332 [email protected]cdd54e>}}
所以,得到一个协议的实现方式中可以使用: (Foo :impls)
这看起来正是如何实现'extenders'函数的(除了'extenders'只返回键 - 即只有类)。鉴于协议的表示可能会随时间而改变,如果您只需要这些类型,最好使用“扩展器”。 – 2015-09-10 16:21:41
比照extenders
和SO希望我输入更多的字符。
可能的重复http://stackoverflow.com/questions/14246945/clojure-listing-all-deftypes-that-implement-some-protocol-within-the-namespace?rq=1 – Alex 2013-02-18 15:09:01