0

这是我的函数参数声明:

(defn insert!
 [db mode {:keys [id paths name engage cost failpage redirect priority]}]
 ...fn body...

来自 repl 的测试调用:

(insert! (:db system) :update {:id 1 :paths [] :name "blah" :engage 2 
       :cost 3 :failpage "hi" :redirect "meta" :priority 9})

这失败并出现错误: ArityException Wrong number of args (2) passed to: campaign$insert-BANG-$fn

我无法弄清楚这一点;看来我的调用与函数声明完全匹配。我真的错过了什么愚蠢的东西吗?

4

1 回答 1

7

您的消息中$fn的最后一个campaign$insert-BANG-$fn1ArityException表示它是一个在内部创建的匿名函数insert!(使用fn表单或#()语法),它接收到错误数量的参数。一般来说,这样的函数有可能“转义”封闭函数(封闭函数可以将其作为其值返回或将其放在某个 Atom 中的某个地方等),但在这里会在insert!'s body 的某个地方找到错误的调用,所以你需要检查一下。

如果问题出在insert!自身,则异常消息将campaign$insert_BANG_改为提及。

来自 REPL 的插图:

user=> (defn foo [x] ((fn [x y] (+ x y)) x))
#'user/foo
user=> (foo 1 2)
ArityException Wrong number of args (2) passed to: user$foo  clojure.lang.AFn.throwArity (AFn.java:437)
user=> (foo 1)
ArityException Wrong number of args (1) passed to: user$foo$fn  clojure.lang.AFn.throwArity (AFn.java:437)

请注意user$foo第一种情况(foo使用两个参数而不是一个参数调用)和user$foo$fn第二种情况(调用(fn [x y] (+ x y))内部只有一个参数foo)。


1实际上,我希望阅读_BANG_.

于 2013-09-05T06:36:50.310 回答