2013-02-18 87 views
1

的类/接口假设我有一个Clojure的协议:列表,一个Clojure的协议已经被扩展到

(defprotocol Foo 
    (bar [x])) 

我知道这个协议可能已被扩展(有extend-protocolextend-type)与数Java类的和/或接口。

如何获得Foo已在运行时扩展到的类的列表?

+0

可能的重复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

回答

-1

有两种情况来处理

  • extend-typeextend-protocol
  • deftypedefrecord

https://stackoverflow.com/a/14261880/1756702的答案讨论这个。

+4

这是一个字 - 为我的答案的字体副本在这里: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

+0

我已经标记和编辑这个来解决抄袭问题。请随时改进摘要,但请确保您将原作者的功劳归功于此。 – 2013-02-18 17:07:59

2

协议被实现为地图数据结构作为实施例显示:

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)

+0

这看起来正是如何实现'extenders'函数的(除了'extenders'只返回键 - 即只有类)。鉴于协议的表示可能会随时间而改变,如果您只需要这些类型,最好使用“扩展器”。 – 2015-09-10 16:21:41