【发布时间】:2015-06-02 13:08:52
【问题描述】:
更新
这个问题在很大程度上是重复的,但下面的问题和我的回答似乎更具说明性。上一个问题见Access Java fields dynamically in Clojure?。
我正在尝试从 Clojure 查找 Java 对象实例中的字段设置。点运算符似乎在我天真地期望它起作用的地方失败了。
例如,有了这些定义......
(defn example-point []
(let [instance (java.awt.Point. 1 2)]
(list (. instance x) (. instance y))))
(defn example-point-1 []
(let [instance (java.awt.Point. 1 2)
fields '("x" "y")]
(map #(. instance (symbol %))
fields)))
(defn example-point-2 []
(let [instance (java.awt.Point. 1 2)
fields (map symbol '("x" "y"))]
(map (fn [field] (eval `(. ~instance ~field)))
fields)))
我得到这些返回值:
flood.core> (example-point)
(1 2)
这很好,但是如果我想“以编程方式”提供字段的名称怎么办?这就是其他功能应该做的事情。以我天真的思维方式,它们应该返回与上面相同的值。但它们都给出了不同的错误。
flood.core> (example-point-1)
IllegalArgumentException 找不到匹配方法:类 java.awt.Point clojure.lang.Reflector.invokeMatchingMethod (Reflector.java:53) 的符号
flood.core> (example-point-2)
CompilerException java.lang.RuntimeException: Can't embed object in code, may not defined print-dup: java.awt.Point[x=1,y=2], compile:(/tmp/form-init1213427540543573506. clj:1:5659)
我卡住了,你能帮我解决这个问题吗?
进一步更新
我确实尝试过,但它又产生了另一个错误。
;; added in response to suggestion...
(defn example-point-3 []
(let [instance (java.awt.Point. 1 2)
fields (map symbol '("x" "y"))]
(map (fn [field] (eval `(. instance ~field)))
fields)))
flood.core> (example-point-3)
CompilerException java.lang.RuntimeException: No such var: flood.core/instance, 正在编译:(/tmp/form-init1213427540543573506.clj:1:5659)
【问题讨论】: