的類/接口假設我有一個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