如何在 Java 对象中分解设置许多不同字段的代码?我想考虑因素
(set! (. employee name) "Chris")
(set! (. employee age) 100)
(set! (. employee salary) 5000)
to
(doseq [field '((name "Chris") (age 100) (salary 5000))]
(set! (. employee (first field)) (second field)))
然而,这不起作用,因为句点是一个宏,并尝试按字面意思评估(第一个字段)。顺便说一句,我知道设置字段不是一个好的做法。我需要与遗留代码进行互操作。
尝试使用设置器 - 但如果您别无选择并且确实需要将其排除在外,则可以使用像这样的宏:
(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]>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)