Tôi muốn có một chức năng trong loại của tôi có một đối số tùy chọn. Tôi đã sử dụng thành công các đối số tùy chọn trong các hàm không thuộc về một kiểu, tuy nhiên, tôi dường như không thể làm cho nó hoạt động trong một giao thức và kiểu.Làm thế nào để sử dụng các đối số tùy chọn trong defprotocol?
thử nghiệm thất bại của tôi:
Clojure 1.4.0
user=> (defprotocol OptArg
(func [this a & b]))
OptArg
user=> (deftype Imp [] OptArg
(func [this a & b] (println a b)))
user.Imp
user=> (func (Imp.) 1 2)
CompilerException java.lang.IllegalArgumentException: No single method: func of interface: user.OptArg found for function: func of protocol: OptArg, compiling:(NO_SOURCE_PATH:5)
user=> (defn opt-arg [a & b] (println a b))
#'user/opt-arg
user=> (opt-arg 1 2)
1 (2)
nil
user=> (opt-arg 1)
1 nil
nil
user=>
thanks a lot. là một người mới bắt đầu Clojure, tôi thực sự mong rằng các thông báo lỗi của nó có thể có ý nghĩa gì đó. –
+1. Nhưng đáng nói thêm rằng một giải pháp tốt là tạo ra một phương thức bên ngoài giao thức mà * có * hỗ trợ varargs, và có hàm này gọi hàm thích hợp (s) trong chính giao thức đó – mikera