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の in campaign$insert-BANG-$fn1は、内部で(フォームまたは構文で)ArityException作成された匿名関数が間違った数の引数を受け取っていることを示しています。一般に、そのような関数が囲んでいる関数を「エスケープ」することは可能です (囲んでいる関数は、それを値として返すか、Atom のどこかに入れることができます) 。そのため、検査する必要があります。insert!fn#()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)

最初のケース ( 1 つではなく 2 つの引数で呼び出す) と 2user$foo番目のケース (内で 1 つの引数のみで呼び出す) に注意してください。foouser$foo$fn(fn [x y] (+ x y))foo


1実際には_BANG_.

于 2013-09-05T06:36:50.310 に答える