假设我有一个 Clojure 协议:
(defprotocol Foo
(bar [x]))
我知道这个协议可能已经(使用extend-protocol
或extend-type
)扩展到许多 Java 类和/或接口。
如何获取Foo
在运行时扩展的类的列表?
参看。extenders
所以希望我输入更多字符。
协议被实现为地图数据结构,如示例所示:
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)
有两种情况需要处理
extend-type
和extend-protocol
deftype
和defrecord
有关讨论此问题的答案,请参阅https://stackoverflow.com/a/14261880/1756702。