2011-02-03 20 views
20

Clojure 1.2 में:निम्नलिखित क्लोजर प्रोटोकॉल में क्या गलत है?

(defprotocol PP 
    (foo [bar]) 
    (foo [bar baz])) 
=> PP 

(extend-protocol PP 
    Object 
    (foo [bar] 1) 
    (foo [bar baz] 2)) 
=> nil 

(foo "hello!") 
=> #<CompilerException java.lang.IllegalArgumentException: No single method: foo of interface: PP found for function: foo of protocol: PP 

कहाँ मैं गलत हो रहा हूँ? मैं foo फ़ंक्शन के एकल-तर्क संस्करण के परिणाम के रूप में 1 को देखने की अपेक्षा करता हूं, क्योंकि "हैलो!" स्पष्ट रूप से java.lang.Object का एक उदाहरण है।

उत्तर

33

मुझे लगता है कि आपके प्रोटोकॉल में दूसरा foo पहले वाला क्लॉबरिंग कर रहा है। आप जिस चीज का उपयोग कर रहे हैं उससे अधिकता पर ओवरलोडिंग थोड़ा अलग वाक्यविन्यास है।

user> (defprotocol PP 
     (foo [bar] [bar baz])) 
PP 
user> (extend-protocol PP 
     Object 
     (foo 
      ([bar] 1) 
      ([bar baz] 2))) 
nil 
user> (foo "foo") 
1 
user> (foo "foo" "bar") 
2 
+0

धन्यवाद! बहुत रोचक, मुझे एहसास नहीं हुआ कि इस तरह से परिभाषाओं को ओवरराइट करना संभव था ... एक स्नीकी गॉचा की तरह लगता है! – mikera

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