2013-02-18 83 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