2011-11-14 24 views
5

Có gì sai khi sử dụng các tham số còn lại dưới đây với defprotocol và defrecord trong Clojure?Điều gì sai với việc sử dụng các tham số còn lại với defprotocol và defrecord trong Clojure?

(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)) 

Đoạn mã trên sẽ in kết quả tôi mong đợi:

"one arg" 
"more than one arg" 

Nhưng nếu tôi bỏ ghi chú một trong những dòng nhận xét, tôi nhận được ngoại lệ dưới đây:

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 

Tại sao điều này?

+0

Dường như chức năng gửi giao thức không hỗ trợ các hàm có tham số variadic. – Ankur

+1

có thể trùng lặp của [Giao thức clojure cho phép một để có một phương pháp variadic cách funcions làm (với một dấu và)?] (Http://stackoverflow.com/questions/5401378/do-clojure-protocols-allow-one-to -have-a-variadic-method-the-way-funcions-do-wi) – amalloy

Trả lời

6

Theo như tôi có thể biết, các giao thức không hỗ trợ các đối số variadic. Điều có thể xảy ra là "&" được lấy làm biểu tượng đối số thay vì chỉ số VAR/danh sách biến thể.

+1

Bạn nói đúng. Bực bội như thế nào! Tôi phải hiểu lầm về việc sử dụng các giao thức dự định nếu như vậy. – OpenSauce

Các vấn đề liên quan