ArityException,但所有参数似乎都存在

TG-*_*G-T 0 clojure

这是我的函数参数声明:

(defn insert!
 [db mode {:keys [id paths name engage cost failpage redirect priority]}]
 ...fn body...
Run Code Online (Sandbox Code Playgroud)

并且来自repl的测试调用:

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

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

我无法想出这一个; 似乎我的调用与函数声明完全匹配.我有什么东西真的很蠢吗?

Mic*_*zyk 7

最终$fncampaign$insert-BANG-$fn1在你ArityException的消息指示它是内部产生一个匿名函数insert!(用fn形式或#()正在接收错误的参数数目语法).一般情况下,这样的函数可以"逃避"封闭函数(封闭函数可以将其作为其值返回或将其放在Atom某处等),但是这里错误的调用将在某个地方找到insert!,所以你需要检查一下.

如果问题出在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)
Run Code Online (Sandbox Code Playgroud)

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


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