2011-10-27 12 views
10

Daha fazla Clojure tuhaflığı. Tanımlamaya ve çağırmaya çalıştığım bu işleve sahibim. Bu 3 argüman var ama 3 argümanlar ile çağırdığınızda ben 2 argümanlarla da çağırdığınızdaBir Clojure işlevine geçen hata sayısı yanlış alındı ​​

Wrong number of args (1) passed to: solr-query$correct-doc-in-results-QMARK-$fn 
[Thrown class clojure.lang.ArityException] 

olsun ben

Wrong number of args (2) passed to: solr-query$correct-doc-in-results-QMARK- 
    [Thrown class clojure.lang.ArityException] 

olsun ve ben 4 argümanları ile demenden

olsun

(defn correct-doc-in-results? [query results docid] 
    "Check if the docid we expected is returned in the results" 
    (some #(.equals docid) (map :id (get results query)))) 
: burada
Wrong number of args (4) passed to: solr-query$correct-doc-in-results-QMARK- 
    [Thrown class clojure.lang.ArityException] 

fonksiyonunun tanımıdır

(correct-doc-in-results? "FLASHLIGHT" all-queries "60184") 

kimse ne olup bittiğini bir fikrin var:

ve burada (emacs'taki REPL kullanarak swank itibaren) diyoruz çalışıyorum nasıl? Neden 3'ü geçtiğimde sadece 1 argümandan geçtiğimi düşünüyorum, ama 2 veya 4 için doğru mu? Henüz çok akıcı bir clojure programcısı değilim, ama bir işlevi tanımlamak oldukça basit.

cevap

15

Not ilk fonksiyonu correct-doc-in-results? belirtir

solr-query$correct-doc-in-results-QMARK-$fn

solr-query$correct-doc-in-results-QMARK-

ile

fark. İkincisi, bu işlevin içinde tanımlanmış bazı anonim işlevlere başvurur.

2 veya 4 bağımsız değişkeni iletirseniz, beklendiği gibi üst düzey işleviniz için bir hata alırsınız. 3 bağımsız değişkeni geçtiğinizde, #(.equals docid) için bir hata alıyorsunuz, çünkü #(.equals docid) sıfır argüman istiyor ancak bir tane alıyor. #(.equals % docid)'a değiştirmeyi deneyin.

+0

Elbette. Basit açıklama için teşekkürler. –

+2

@Brian aslında hatanın anonim işlevi sıfır args (% yok) istemesi ve "bazı" ile çağrıldığında bir tane almasıdır. Tabii ki, eğer işlev aslında * argümanlar olmadan çağrıldıysa, o zaman sadece bir argümanla '.equals'ı çağırmaya çalışarak başka bir hataya sebep olur. – amalloy

+0

Haklısınız, cevabımı düzenleyeceğim. –

İlgili konular