1

私はClojureが初めてで、leiningen + clojure + Javaを含むアプリケーションで作業していますが、問題はプラグインlein-environ "1.0.0"にあります。

アプリ内では、「env」マップを多く使用しています。.lein_env または project.clj 内で定義された既存の値を読み取ることによって。しかし、同じアプリケーション内でいくつかのことを行っています:

(attach! :my-val (str (env :api-host) "/api/" (env :resource)))

この値を で出力する(println (env :my-val))と、コンテンツが表示されます。しかし、マップとして Java に送信しようとすると、この値が表示されません。以前に定義された値を取得します。.lein_env のすべてを意味しますが、アプリケーションで計算された値はありません。

関数に関するAPIやドキュメントを見つけていないattach!ので、正直なところ、それが何をするのかわかりません。しかし、値はenvから読み取られるため、それらのキーをマップに添付していると思いました。

私はenvをclojure内でHashMapに変換しようとしました:

(defn- creat-env-hash-map []
    (java.util.HashMap. (env)))

それでも同じ結果が得られますが、それらの値はマップされていません。

私は何が間違っているのか、これが可能かどうか疑問に思います。

どうもありがとうございました。

編集:

私は途中でJavaコードを呼び出します:

(println (com.my.package.HelperClass/staticMethod env))

Java の静的メソッド:

public static String staticMethod(HashMap<String, String> map) {
    String result = "";
    Iterator it = map.entrySet().iterator();
    while (it.hasNext()) {
        Map.Entry pair = (Map.Entry)it.next();
        result += pair.getKey() + " = " + pair.getValue() + "\n";
        it.remove(); // avoids a ConcurrentModificationException
    }
    return result;
}
4

2 に答える 2

0

Clojureの「env」を正しく理解していませんでした。Environ はそれを関数としても持っています。これは一種のスマート オブジェクトであり(env :value)、関数を呼び出すように呼び出しますが、すべての値が同じマップに追加されるわけではありません。

Environ には、実行時に設定した値をホストするこの種のコンテキストがあります。

私がやったことは、「事前定義された」値と値の両方をホストする別のマップを作成することでした

(defn- creat-env-hash-map []
(java.util.HashMap. (env)))

(defn- complete-hash-map []
    (doto (creat-env-hash-map)
        (.put "value-a" (str (env :value-a)))
        (.put "value-b" (str (env :value-b)))
))

私は最善のアプローチを使用していない可能性がありますが、前述したように、私は clojure を初めて使用します。他の誰かが正しい答えを持っている場合は大歓迎です。

よろしく

于 2015-12-27T05:14:57.973 に答える