如何将代码设置为设置Java对象中许多不同字段的因素?我想考虑
(set! (. employee name) "Chris")
(set! (. employee age) 100)
(set! (. employee salary) 5000)
至
(doseq [field '((name "Chris") (age 100) (salary 5000))]
(set! (. employee (first field)) (second field)))
但是,这将不起作用,因为句点是一个宏,并且会尝试按字面值求值(第一个字段)。顺便说一句,我了解设置字段不是一个好习惯。我需要与遗留代码进行互操作。
最佳答案
尝试使用setter-但是,如果您别无选择,并且确实需要将其排除在外,则可以使用如下宏:
(defmacro set-all [object & fields-and-values]
(let [obj-sym (gensym)]
`(let [~obj-sym ~object]
~@(for [[field value] (partition 2 fields-and-values)]
`(set! (. ~obj-sym ~field)
~value)))))
如果表达式产生对象有任何副作用,则需要gensym。
用法示例:
user> (def p (java.awt.Point.))
#'user/p
user> (set-all p x 4 y 5)
5
user> p
#<Point java.awt.Point[x=4,y=5]>
关于clojure - 因子Clojure代码可在Java对象中设置许多不同的字段,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4579679/