Có cách nào được ghi lại để tìm ra giao thức nào được thực hiện bởi đối tượng Clojure không? Cách khác xung quanh (hiển thị cho các lớp học một giao thức nhất định được mở rộng) là dễ dàng: (giao thức bộ mở rộng).Làm cách nào để tìm các giao thức được triển khai trong đối tượng Clojure?
Trả lời
tôi đã kết thúc với việc thực hiện sau đây:
(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)))
Đầu tiên nó sẽ tìm kiếm tất cả những biểu tượng trong không gian tên hiện tại (bạn có thể tất nhiên mở rộng này cho tất cả các không gian tên) cho dù họ là định nghĩa giao thức hoặc ròng (tất cả -giao thức). Tiếp theo nó sẽ tìm một biểu tượng cho sẵn nếu nó đáp ứng một trong các giao thức này.
Giao thức? chức năng sử dụng phím: trên giao diện không được ghi lại, vì vậy chức năng này không thể di chuyển được.
Tôi thực sự không thể thử điều này vào lúc này, nhưng bạn có thể muốn thử phương thức lớp Java: getGenericInterfaces
. Điều này sẽ cung cấp cho bạn một danh sách các giao diện. Có lẽ những cách khác để có được thông tin này bằng cách sử dụng các phương pháp tương tự nhưng tôi đã không nhìn.
Nếu bạn cũng xem mã nguồn, bạn sẽ thấy cách thức giao thức được thiết lập (bạn có thể truy cập nguồn bằng cách nhấp vào liên kết trong api clojure). Trong Clojure 1.3 có một chức năng 'tư nhân' trông như thế này:
(defn- protocol?
[maybe-p]
(boolean (:on-interface maybe-p)))
Chức năng này được sử dụng bởi extend
chức năng Clojure để kiểm tra xem bạn đã thực sự cung cấp một giao thức. Nếu bạn thực hiện chức năng của riêng mình như vậy, bạn có thể lọc kết quả của getGenericInterfaces
. Vì đây là chi tiết nội bộ nên có thể thay đổi.
getGenericInterfaces cung cấp cho tôi (clojure.lang.IObj clojure.lang.ILookup clojure.lang.IKeywordLookup clojure.lang.IPersistentMap java.util.Map java.io.Serializable) nhưng không phải là giao thức được triển khai. Tôi đoán tôi sẽ phải nghiên cứu mã nguồn để xem nó được thực hiện như thế nào. –
Chỉ cần quay trở lại máy của tôi, và tôi không nhận được bất kỳ xa hơn bạn đang có. Nó có thể đơn giản hơn để sử dụng 'getInterfaces' như là một lựa chọn hợp lý cho' getGenericInterfaces'. Tôi tự hỏi điều gì sẽ xảy ra nếu bạn AOT biên dịch điều này. – hutch
Một phần của giao thức là một lớp không cần phải thực hiện một giao diện để mở rộng một giao thức: bạn có thể định nghĩa giao thức của riêng mình và sau đó nói rằng một số lớp đã tồn tại mở rộng nó với '(extend ExistingClass MyProtocol ...)'. Do đó, tự nhiên có cách để hỏi "những lớp nào mở rộng giao thức này" nhưng không phải là cách để hỏi câu hỏi ngược. –
- 1. Làm cách nào để triển khai giao thức mạng?
- 2. Làm cách nào để triển khai giao diện Java với các phương thức variadic trong Scala?
- 3. Làm cách nào để nhanh chóng tìm thấy (các) cách triển khai phương thức của giao diện?
- 4. Riêng tư triển khai giao thức?
- 5. Làm cách nào bạn có thể chuyển Danh sách <đối tượng triển khai giao diện> sang phương thức?
- 6. Làm cách nào để gọi phương thức giao diện được triển khai rõ ràng từ PowerShell?
- 7. Làm cách nào để bạn có thể mở rộng giao thức Clojure sang giao thức khác?
- 8. Làm cách nào để triển khai giao diện trong Ada?
- 9. Làm cách nào để triển khai giao diện Iterable?
- 10. Làm cách nào để triển khai các sự kiện thông qua giao diện trong C#?
- 11. Làm cách nào để đơn vị kiểm tra các phương thức trong đối tượng phương thức?
- 12. Làm cách nào để triển khai gọi lại trong C++?
- 13. Làm cách nào để bạn triển khai giao diện trong IronPython?
- 14. Làm cách nào để tách giao diện khỏi việc triển khai trong các dịch vụ Grails?
- 15. Công văn phụ thuộc vào môi trường của các giao thức/đa phương thức trong clojure
- 16. Làm cách nào để triển khai Giao diện có thể đếm được trong PHP?
- 17. Không thể tìm thấy khai báo giao thức trong Xcode
- 18. Làm cách nào để xem các phương pháp được liên kết với một đối tượng trong Clojure?
- 19. Làm cách nào để triển khai IEnumerable?
- 20. cách triển khai Giao diện trong C++?
- 21. Làm cách nào để triển khai một chuỗi các chuỗi?
- 22. Làm cách nào để triển khai bộ?
- 23. Làm cách nào để buộc gcc sử dụng các triển khai tùy chỉnh của các hàm được triển khai newlibc?
- 24. Cách tạo đối tượng Java trong Clojure
- 25. Làm thế nào để tìm ra phương pháp đang triển khai giao diện cụ thể
- 26. Kiểm tra xem phương thức giao thức tùy chọn đã được triển khai chưa
- 27. Tìm các giao diện được triển khai ngay lập tức trên một loại
- 28. Tại sao phương thức giao diện C# được triển khai trong một lớp là công khai?
- 29. Triển khai Grails - Cách nhanh nhất để được triển khai?
- 30. Cách triển khai giao diện trong javascript
'giao thức?' Thất bại trên một bản đồ được sắp xếp, ít nhất là trong Clojure 1.8. Xem [câu hỏi này] (http://stackoverflow.com/q/37410580/1393162). –