这是我的函数参数声明:
(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
我无法想出这一个;似乎我的调用与函数声明完全匹配。我有什么东西真的很蠢吗?
答案 0 :(得分:7)
$fn
消息中campaign$insert-BANG-$fn
1 中的最后ArityException
表示它是{{1}内创建的匿名函数(使用insert!
形式或fn
语法)接收错误数量的参数。一般来说,这样的功能可以逃脱"逃避"封闭函数(封闭函数可以将其作为其值返回或将其放入Atom某处等),但是这里有错误的调用将在#()
的正文中找到,所以你&#39 ;我需要检查一下。
如果问题出在insert!
本身,则异常消息会提及insert!
。
REPL的例子:
campaign$insert_BANG_
在第一种情况下注意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))
)。
1 其实我希望能阅读foo
。