如何在defprotocol中使用可选参数?

6 java clojure

我希望在我的类型中有一个带有可选参数的函数.我已经成功地在不属于某个类型的函数中使用了可选参数,但是,我似乎无法让它在协议和类型中工作.

我的失败审判:

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=>
Run Code Online (Sandbox Code Playgroud)

ber*_*eal 8

如此处所述,协议不支持varargs.您必须为每个所需数量的参数定义一个单独的方法,或者只是接受一个列表作为参数.

  • +1.但值得补充的是,一个好的解决方案是在协议之外创建**支持varargs,并让此函数调用协议本身中的相应​​函数 (4认同)