6

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

我失败的试验:

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=>
4

2 回答 2

8

正如这里所回答的,协议不支持可变参数。您必须为每个所需数量的参数定义一个单独的方法,或者简单地接受一个列表作为参数。

于 2012-05-16T06:46:57.267 回答
2

defprotocol+为您制作了一个带有可选参数的协议。这个想法是& args在协议中作为一个固定参数并自动创建一个包装函数。

看看这个关于宏的要点

用法

(defprotocol+ IPipeline
  (运行并等待 [this & args]))

(defrecord+管道[]
  管道
  (运行并等待 [this & args]
    ))

(运行并等待(管道。)1 2 3 4 5)

于 2014-09-22T05:45:11.730 回答