2011-11-14 6 views
5

क्लोजर में डिफप्रोटोकॉल और डिफ्रेकॉर्ड के साथ बाकी पैरा के नीचे उपयोग के साथ क्या गलत है?क्लोजर में डिफप्रोटोकॉल और डिफ्रेकॉर्ड के साथ बाकी पैरा के इस उपयोग के साथ क्या गलत है?

(defprotocol prot 
    (f [this] [this & rest])) 

(defrecord rec [] 
    prot 
    (f [this] "one arg") 
    (f [this & rest] "more than one arg")) 

(prn (f (rec.))) 
; (prn (f (rec.) 5)) 
(prn (f (rec.) 5 6)) 
; (prn (f (rec.) 5 6 7)) 

ऊपर कोड प्रिंट उत्पादन मैं उम्मीद:

"one arg" 
"more than one arg" 

लेकिन अगर मैं टिप्पणी की लाइनों के दोनों uncomment, मैं नीचे अपवाद:

Exception in thread "main" java.lang.IllegalArgumentException: No single method: f of interface: user.prot found for function: f of protocol: prot (bug.clj:10) 
    at clojure.lang.Compiler.analyzeSeq(Compiler.java:5376) 
    at clojure.lang.Compiler.analyze(Compiler.java:5190) 
    at clojure.lang.Compiler.analyze(Compiler.java:5151) 
    at clojure.lang.Compiler$InvokeExpr.parse(Compiler.java:3057) 
    at clojure.lang.Compiler.analyzeSeq(Compiler.java:5371) 
    at clojure.lang.Compiler.analyze(Compiler.java:5190) 
    at clojure.lang.Compiler.analyze(Compiler.java:5151) 
    at clojure.lang.Compiler$BodyExpr$Parser.parse(Compiler.java:4670) 
    at clojure.lang.Compiler$FnMethod.parse(Compiler.java:4328) 
    at clojure.lang.Compiler$FnExpr.parse(Compiler.java:3173) 
    at clojure.lang.Compiler.analyzeSeq(Compiler.java:5367) 
    at clojure.lang.Compiler.analyze(Compiler.java:5190) 
    at clojure.lang.Compiler.eval(Compiler.java:5421) 
    at clojure.lang.Compiler.load(Compiler.java:5857) 
    at clojure.lang.RT.loadResourceScript(RT.java:340) 
    at clojure.lang.RT.loadResourceScript(RT.java:327) 
    at clojure.lang.RT.loadResourceScript(RT.java:319) 
    at clojure.main$load_script.invoke(main.clj:220) 
    at clojure.main$script_opt.invoke(main.clj:273) 
    at clojure.main$main.doInvoke(main.clj:354) 
    at clojure.lang.RestFn.invoke(RestFn.java:409) 
    at clojure.lang.Var.invoke(Var.java:365) 
    at clojure.lang.AFn.applyToHelper(AFn.java:163) 
    at clojure.lang.Var.applyTo(Var.java:482) 
    at clojure.main.main(main.java:37) 
Caused by: java.lang.IllegalArgumentException: No single method: f of interface: user.prot found for function: f of protocol: prot 
    at clojure.lang.Compiler$InvokeExpr.<init>(Compiler.java:2880) 
    at clojure.lang.Compiler$InvokeExpr.parse(Compiler.java:3063) 
    at clojure.lang.Compiler.analyzeSeq(Compiler.java:5371) 
    ... 24 more 

ऐसा क्यों है?

+0

ऐसा लगता है कि प्रोटोकॉल प्रेषण फ़ंक्शन वैरैडिक पैरा के साथ फ़ंक्शंस का समर्थन नहीं करता है। – Ankur

+1

संभावित डुप्लिकेट [क्या क्लोजर प्रोटोकॉल में एक व्यक्ति को फ्लेक्सियंस (एम्पर्सेंड के साथ) एक वैरिएडिक विधि की अनुमति मिलती है?] (Http://stackoverflow.com/questions/5401378/do-clojure-protocols-allow-one-to -हेव-ए-वैरिएडिक-विधि-द-वे-फनकियंस-डू-वाई) – amalloy

उत्तर

6

जहां तक ​​मैं कह सकता हूं, प्रोटोकॉल विविध तर्कों का समर्थन नहीं करते हैं। शायद यह हो रहा है कि "&" को एक भिन्न संकेतक/सूची समझ के बजाय तर्क चिह्न के रूप में लिया जाता है।

+1

आप सही हैं। कितना निराशाजनक! यदि ऐसा है तो मुझे प्रोटोकॉल के इच्छित उपयोग के बारे में कुछ गलत समझा जाना चाहिए। – OpenSauce

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