假设我有一个Clojure协议:
(defprotocol Foo
(bar [x]))
我知道这个协议可能已经扩展(使用extend-protocol
或extend-type
)到许多Java类和/或接口。
如何获取Foo
在运行时已扩展到的类的列表?
答案 0 :(得分: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 user$eval331$fn__332@cdd54e>}}
user=> (extend-protocol Foo String (bar [x] x))
nil
user=> Foo
{:impls {java.lang.String {:bar #<user$eval350$fn__351 user$eval350$fn__351@25bd56>}}, :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 user$eval331$fn__332@cdd54e>}}
因此,要获得协议的实现,您可以使用:
(Foo :impls)
答案 1 :(得分:2)
比照extenders
并且SO要我输入更多字符。
答案 2 :(得分:-1)
有两种情况需要处理
extend-type
和extend-protocol
deftype
和defrecord
请参阅https://stackoverflow.com/a/14261880/1756702以获得有关此问题的答案。