2013-09-05 2 views
0

을 것 같다 것은 내 함수 매개 변수의 선언입니다 ArityException Wrong number of args (2) passed to: campaign$insert-BANG-$fnArityException하지만 모든 인수가 여기에있다

:

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

이 오류와 함께 실패

나는 이것을 이해할 수 없다. 내 호출이 함수 선언과 정확하게 일치하는 것 같습니다. 실종 된 무언가가 정말로 있니?

+1

이 함수의 args를 수정했으며 이후 네일 스페이스를 다시로드 했습니까? 이전 버전을 얻었거나, 실수로 잘못된 네임 스페이스에 정의한 것일 수도 있습니다. – Hendekagon

+0

$ fn은 익명의 기능을 의미합니다. 각 익명 함수에 이름을 추가하면 스택 추적이 더 읽기 쉽습니다. '(fn what-this-fn-does [args])'. 안타깝게도 이것은'#()'구문과 호환되지 않습니다. – noisesmith

답변

7

최종 $fn 당신의 ArityException의 메시지 1campaign$insert-BANG-$fn에서이 insert! 내부에 생성 된 익명 함수는 인수의 잘못된 번호를 수신 (AN 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) 

참고 user$foo 첫 번째 경우 (foo 내부 하나만 인수 (fn [x y] (+ x y))로 통화) 및 두번째의 user$foo$fn (두 대신에 하나의 인자 foo 호출) .


1 사실은 내가 그 _BANG_을 읽을 기대.

+0

이 때문에 익명 함수를 사용하는 것이 좋습니다. 스택 추적이 더 유용 할 것입니다. '(fn 무엇 - fn - 않습니다 [args] ...)'. – noisesmith

관련 문제