2013-09-02 6 views
1

I a défini le MyCache.clj suivantclasses générées clojure gen classe invocation question

(ns abcd.MyCache 
    (:gen-class 
    :name "abcd.MyCache" 
    :init "init" 
    :constructors { [java.text.DateFormat][] } 
    :methods [ [now [] void] [myformat [long] String] ] 
    :state "state" 
    :main false)) 

(defn -init[format] 
    ([[] (atom {:format format})])) 



(defn -now[this] ((:format @(.state this)) (System/currentTimeMillis))) 

(defn -myformat[this time] 
    ((:format @(.state this) (new java.util.Date time)))) 

Je compilé le fichier ci-dessus à l'aide (compilation « abcd.MyCache) avec succès.

Lorsque j'essaie d'utiliser les classes générées comme indiqué ci-dessous..J'ai des erreurs. S'il vous plaît aider.

user=> (new abcd.MyCache (new java.text.SimpleDateFormat "mmDDyyyy")) 
IllegalArgumentException Key must be integer clojure.lang.APersistentVector.invoke (APersistentVector.java:265) 
+0

Que pensez-vous que ce soit Faire? ([[] (atome {: format de format})]) – Chiron

Répondre

1

Je ne me sens pas bien à ce sujet:

(defn -init[format] 
    ([] [atom {:format format}])) 

Vous essayez d'obtenir un élément d'un vecteur et il est un indice s'attend (nombre).

Ce qui est correct est de deref l'atome et d'obtenir sa valeur en tant qu'indice du vecteur. Mais encore une fois dans votre cas, vous essayez d'interroger un vecteur vide. Notez également que [atom {: format format}] n'est pas la manière correcte de créer un atome. Vous devez utiliser:

(atom {:format format}) 

Et en passant, sous la forme suivante est celle préférée pour créer des objets Java (rien de mal avec (nouveau) bien sûr):

(Date.) 
(DateFormat.) 
+0

Merci d'avoir signalé le problème avec atom. – psaradhi

+0

(defn -init [format] ([[] (atome {: format de format})])) utilisateur => (abcd.MyCache. (Java.text.SimpleDateFormat. "MmDDyyyy")) ArityException Mauvais nombre de args (0) passé à: PersistentVector clojure.lang.AFn.throwArity (AFn.java:437) – psaradhi

+0

J'ai réalisé mon erreur. init doit être défini comme (defn -init [format] [[] (atome {: format de format})]). J'ai des parenthèses supplémentaires entourant le tableau de retour provoquant cette erreur. Merci Chiron – psaradhi

Questions connexes