Factor Clojure代码在Java对象中设置许多不同的字段 [英] Factor Clojure code setting many different fields in a Java object

查看:138
本文介绍了Factor Clojure代码在Java对象中设置许多不同的字段的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何在Java对象中设置许多不同字段的代码?我想要

How do I factor code setting many different fields in a Java object? I would like to factor

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

工作,因为句点是一个宏,并尝试逐字地评估(第一个字段)。顺便说一句,我明白设置字段不是好的做法。

However this won't work because the period is a macro, and tries to evaluate (first field) literally. By the way, I understand that setting fields is not good practice. I need to inter-operate with legacy code.

推荐答案

尝试使用setter - 但如果你没有选择,真的需要因此,这样的宏将做:

Try to use setters - but if you have no choice and really need to factor this out, a macro like this would do:

(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。

The gensym is needed in case the expression yielding object has any side effects.

用法示例:

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

这篇关于Factor Clojure代码在Java对象中设置许多不同的字段的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆