Bir Clojure nesnesi tarafından hangi protokollerin uygulandığını bulmanın belgelenmiş bir yolu var mı? Başka bir şekilde (belirli bir protokolün hangi sınıflar için genişletildiğini gösterin) kolaydır: (genişleticiler protokolü).Clojure nesnesinde uygulanan protokolleri nasıl bulabilirim?
cevap
aşağıdaki uygulanması ile sona erdi -protocols). Daha sonra, bu protokollerden birini yerine getirmesi durumunda belirli bir sembolü arar.
Protokol mü? işlevi kullanır: afaik belgelenmeyen arabirim anahtarı, bu nedenle bu işlev taşınabilir değildir.
Bunu şu anda deneyemiyorum, ancak Java sınıfı yöntemini denemek isteyebilirsiniz: getGenericInterfaces
. Bu size arayüzlerin bir listesini vermelidir. Bu bilgiyi benzer yöntemler kullanarak elde etmenin başka yolları da var ama ben bakmadım.
Ayrıca, kaynak koduna bakarsanız, protokollerin nasıl ayarlandığını görürsünüz (clojure api'deki bağlantılara tıklayarak kaynağa ulaşabilirsiniz). Bu fonksiyon aslında bir Protokolünü sağladık kontrol etmek Clojure en extend
işlevi tarafından kullanılan
(defn- protocol?
[maybe-p]
(boolean (:on-interface maybe-p)))
: Clojure 1.3 olarak şöyle bir 'özel' işlevi yoktur. Kendi işlevinizi böyle yaparsanız, getGenericInterfaces
sonuçlarını filtreleyebilirsiniz. Bu bir iç detay olduğu için değişebilir.
(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)))
Önce (tabii tüm ad alanlarına bu uzatabilirsiniz) onlar protokol tanımları veya net (bütün olup olmadığını geçerli ad alanındaki tüm sembollerin arar:
getGenericInterfaces bana uygulanan clojure.lang.IObj clojure.lang.ILookup clojure.lang.IKeywordLookup clojure.lang.IPersistentMap java.util.Map java.io.Serializable) verir. Sanırım nasıl yapıldığını görmek için kaynak kodun içine girmem gerekecek. –
Sadece makineme geri döndüm ve sizden daha fazlasını elde edemiyorum. "GetInterfaces" öğesini getGenericInterfaces'e makul bir alternatif olarak kullanmak daha kolay olabilir. Bir şey derlersen, ne olacağını merak ediyorum. – hutch
Protokoller noktasının bir kısmı, bir sınıfın bir protokolü genişletmek için bir arabirimi uygulamaya koyması gerekmemesidir: kendi protokolünüzü tanımlayabilir ve daha sonra bazı önceden var olan sınıfın bunu (ExistingClass MyProtocol ...) ile genişleteceğini söyleyebilirsiniz. Böylece, "bu protokolü hangi sınıfları genişletir" sorusunu sormak doğaldır, fakat ters soruyu sormanın bir yolu değildir. –
- 1. Faktör Clojure kodunun bir Java nesnesinde birçok farklı alanın ayarlanması
- 2. Aşağıdakilerle uygulanan bir RPC'yi nerede bulabilirim: boost + protobuf
- 3. javascript'te olası web protokolleri
- 4. Materyalleştirilmiş Görüntüleme: Yenileme sırasında uygulanan güncelleme, ekleme ve silme sayısını nasıl bulabilirim?
- 5. Clojure
- 6. Clojure
- 7. Clojure
- 8. Clojure
- 9. Clojure
- 10. Clojure
- 11. Clojure
- 12. Clojure
- 13. Clojure
- 14. Clojure
- 15. Clojure
- 16. clojure
- 17. Clojure Dosyası Nasıl Çalıştırılır?
- 18. NSArray nesnesinde NSString dönüştürme
- 19. WebSocket ve CGI/FastCGI/SCGI protokolleri
- 20. DateTime nesnesinde farklı timezone_types
- 21. SVN kaynımı nasıl bulabilirim?
- 22. Paketimi nasıl bulabilirim?
- 23. Modelin ilişkilerini nasıl bulabilirim?
- 24. WebSocket ve STOMP protokolleri arasındaki fark nedir?
- 25. Bağımlılığımdan hangilerinin belirli bir jar'ı indirdiğini nasıl bulabilirim?
- 26. Güvenlik Protokolleri .Net 3.5 çerçevesi içinde TLS 1.2 nasıl uygulanır?
- 27. NA'lar bir raster nesnesinde nasıl değiştirilir
- 28. Unicode dize anahtarını Javascript nesnesinde nasıl kullanabilirim?
- 29. JSON Nesnesinde JSON Dizisi Nasıl Alınır?
- 30. Bir PHP5 nesnesinde ek açıklamalar nasıl bulunur?
'protokolü? Kullanılarak sıralanmış bir harita üzerinde, en azından Clojure 1.8'de uygulanıp uygulanmadığını kontrol etmektir. Bkz. [Bu soru] (http://stackoverflow.com/q/37410580/1393162). –