是否有文件記錄的方式來查找哪些協議是由Clojure對象實現的?反過來(顯示給定協議擴展的類)很容易:(擴展協議)。如何在Clojure對象中找到已實現的協議?
回答
我結束了以下實現:
(defn protocol? [maybe-p]
(boolean (:on-interface maybe-p)))
(defn all-protocols []
(filter #(protocol? @(val %)) (ns-publics *ns*)))
(defn implemented-protocols [sym]
(filter #(satisfies? @(val %) sym) (all-protocols)))
首先,它會在當前命名空間中所有的符號(當然你也可以此擴大到所有命名空間)無論是協議定義或淨(所有-protocols)。接下來,它會查找給定的符號,如果它滿足這些協議之一。
該協議?函數使用:on-interface key,這是沒有記錄的afaik,所以這個函數是不可移植的。
我目前實際上無法嘗試此操作,但您可能需要嘗試Java類方法:getGenericInterfaces
。這應該給你一個接口列表。可能有其他方法可以使用類似的方法獲取這些信息,但我沒有看過。
如果你也看看源代碼,你會看到如何設置協議(你可以通過點擊clojure api中的鏈接來獲得源代碼)。用Clojure 1.3還有一個「私人」功能,看起來像這樣:
(defn- protocol?
[maybe-p]
(boolean (:on-interface maybe-p)))
此功能使用Clojure的extend
函數來檢查,你實際上已經提供了一個協議。如果你創建自己的功能,你可以過濾getGenericInterfaces
的結果。由於這是內部細節,因此可能會有所變更。
getGenericInterfaces給我(clojure.lang.IObj clojure.lang.ILookup clojure.lang.IKeywordLookup clojure.lang.IPersistentMap java.util.Map java.io.Serializable)但不是實現的協議。我想我必須深入研究源代碼,看看它是如何完成的。 –
剛回到我的機器,我沒有比你更進一步。使用'getInterfaces'作爲'getGenericInterfaces'的合理替代方法可能更簡單。我想知道如果你AOT編譯的話會發生什麼。 – hutch
協議點的一部分是一個類不需要實現一個接口來擴展一個協議:你可以定義你自己的協議,然後說一些預先存在的類用'(擴展ExistingClass MyProtocol ...)'擴展它。因此,有一種方法可以問「什麼類擴展了這個協議」,而不是一種提出相反問題的方法。 –
- 1. Swift聲明AnyClass對象實現協議
- 2. 查找Clojure記錄/類型實現的接口/協議?
- 3. Clojure - 自定義實現的混合協議默認實現
- 4. 如何在Ruby中實現INSTREAM協議?
- 5. 如何在MPI協議中實現MPI_Comm?
- 6. 如何顯示實現MkAnnotation協議的對象的調用?
- 7. 如何實現協議
- 8. 如何在Clojure中編寫monoid協議?
- 9. 如何將Clojure協議擴展到其他協議?
- 10. Clojure的:在協議的方法沒有實現
- 11. 協議實現中的IBOutlet
- 12. 協議在內部如何實現?
- 13. 在使用關聯對象的協議錯誤中找不到
- 14. 如何在swift中對performSelector使用默認協議實現?
- 15. 實現NSCoding協議
- 16. 如何檢測對象是否在Objective-C中實現了NSFastEnumeration協議?
- 17. 如何實現UIApplicationDelegate的協議方法?
- 18. 如何實現Three20框架的協議?
- 19. Linux協議中的http協議實現在哪裏
- 20. 嘲笑Clojure協議
- 21. 在node.js中實現的WADO協議
- 22. iPhone - 如何知道協議方法是否已實現?
- 23. Clojure的擴展型VS DEFTYPE和協議實現
- 24. Clojure - Object上的默認協議實現失敗?
- 25. 實現我創建的協議的對象的方法不叫
- 26. 爲什麼在clojure中實現協議時會出現「Unsupported binding form」錯誤?
- 27. 列表,一個Clojure的協議已經被擴展到
- 28. 實現協議的具體類的返回對象
- 29. CSAFE協議的實現
- 30. 網絡協議的實現
'protocol?'在排序映射上失敗,至少在Clojure 1.8中失敗。看[這個問題](http://stackoverflow.com/q/37410580/1393162)。 –