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

时间:2012-05-16 06:29:36

标签: 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=>

2 个答案:

答案 0 :(得分:8)

回答here时,协议不支持varargs。您必须为每个所需数量的参数定义一个单独的方法,或者只是接受一个列表作为参数。

答案 1 :(得分:2)

我为你做了一个defprotocol+来定义带有可选参数的协议。我们的想法是将& args作为协议中的固定参数,并自动创建包装函数。

查看this gist的宏。

用法

(defprotocol+ IPipeline
  (run-and-wait [this & args]))

(defrecord+ Pipeline []
  IPipeline
  (run-and-wait [this & args]
    ))

(run-and-wait (Pipeline.) 1 2 3 4 5)