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

时间:2013-09-05 04:02:49

标签: clojure

这是我的函数参数声明:

(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

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

1 个答案:

答案 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