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

如果我用 a 打印这个值,(println (env :my-val))我会看到内容。但是如果我尝试将它作为 Map 发送到 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

1

好的,看起来 Clojure 的持久映射实现java.util.Map但不是java.util.HashMap. 这意味着您的 Java 方法需要采用Map<Object, Object>.

如果您HashMap在 Java 中需要 a,您的 Java 方法可以将映射从 Clojure 传递到HashMap构造函数。

这种方法是您实际使用的方法,还是简化方法?

于 2015-12-21T04:12:01.090 回答
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 回答