Clojureプロトコルがあるとします。
(defprotocol Foo
(bar [x]))
私は、このプロトコルが(extend-protocol
またはでextend-type
)多くのJavaクラスおよび/またはインターフェースに拡張された可能性があることを知っています。
Foo
実行時に拡張されたクラスのリストを取得するにはどうすればよいですか?
参照。extenders
そしてSOは私にもっと文字を入力してほしいと思っています。
例に示すように、プロトコルはマップ データ構造として実装されます。
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)
対処するケースは2つ
extend-type
とextend-protocol
deftype
とdefrecord
これに関する回答については、https://stackoverflow.com/a/14261880/1756702を参照してください。