2012-09-22 10 views
5

लागू करता है Clojure में एक सेट, नक्शे और वेक्टर दोनों IPersistentCollection और IFN लागू, कैसे Clojure उपयोग करने का निर्णय करता है SayHi की जो कार्यान्वयन को देखते हुए:संकल्प जब वर्ग कई इंटरफेस

(defprotocol SayHi 
    (hi [this])) 

(extend-protocol SayHi 
    clojure.lang.IPersistentCollection 
    (hi [_] (println "Hi from collection")) 
    clojure.lang.IFn 
    (hi [_] (println "Hi from Fn!")) 
    clojure.lang.IPersistentSet 
    (hi [_] (println "Hi from set!"))) 

(hi #{}) 
Hi from set! 
(hi []) 
Hi from collection 

उत्तर

5

प्रोटोकॉल प्रेषण किया जाता है समारोह के पहले तर्क के प्रकार पर। जब कई कार्यान्वयन पहले तर्क के प्रकार से मेल खाते हैं, तो सबसे विशिष्ट कार्यान्वयन चुना जाता है। यही कारण है कि (hi #{}) कॉल सेट कार्यान्वयन के लिए हल करता है, न कि संग्रह या एफएन कार्यान्वयन, भले ही एक सेट (#{}) उन दोनों को लागू करता है।

clojure-deftype.clj में find-protocol-impl समारोह वस्तु संकल्प को लागू करने के लिए प्रोटोकॉल को संभालने के लिए लगता है:

(defn find-protocol-impl [protocol x] 
    (if (instance? (:on-interface protocol) x) 
    x 
    (let [c (class x) 
      impl #(get (:impls protocol) %)] 
     (or (impl c) 
      (and c (or (first (remove nil? (map impl (butlast (super-chain c))))) 
        (when-let [t (reduce1 pref (filter impl (disj (supers c) Object)))] 
         (impl t)) 
        (impl Object))))))) 
+1

आप जहां यह हो जाए clojure स्रोत कोड को इंगित कर सकते हैं? मैं इसे खोजने में सक्षम नहीं हूं – DanLebrero

+1

@dAni ने उत्तर को अपडेट किया –

संबंधित मुद्दे