1

次の MyCache.clj を定義しました

(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))))

(compile 'abcd.MyCache) を使用して上記のファイルを正常にコンパイルしました。

以下に示すように、生成されたクラスを使用しようとすると、エラーが発生します。助けてください。

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

1 に答える 1

1

私はこれについて気分が良くありません:

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

ベクトルから要素を取得しようとしていますが、インデックス (数値) が必要です。

正しいのは、アトムを deref し、その値をベクトルのインデックスとして取得することです。しかし、あなたの場合も、空のベクトルを照会しようとしています。

[atom {:format format}] はアトムを作成する正しい方法ではないことにも注意してください。以下を使用する必要があります。

(atom {:format format})

ちなみに、Java オブジェクトを作成するには、次の形式が推奨されます (もちろん、(新しい) に問題はありません)。

(Date.)
(DateFormat.)
于 2013-09-02T15:10:01.850 に答える