2011-01-10 14 views

cevap

5

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.

+0

'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). –

0

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:

+0

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. –

+0

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

+2

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. –