Groovy属性迭代 [英] Groovy property iteration
问题描述
在下面的Groovy代码中,我替换了 feck
, ass
,使用
Foo2
In the Groovy code below I replace the values of the feck
, arse
, drink
properties of an instance of Foo
with those of an instance of Foo2
class Foo {
def feck = "fe"
def arse = "ar"
def drink = "dr"
}
class Foo2 {
def feck = "fe2"
def arse = "ar2"
def drink = "dr2"
}
def f = new Foo()
def f2 = new Foo2()
["feck", "arse", "drink"].each {it ->
f."$it" = f2."$it"
}
有没有更好的方法来做到这一点?我对上述代码的特别关注是属性名称作为字符串存储在列表中,当(例如)使用重构IDE更改其中一个属性名称时,这些名称可能会丢失。
Is there a better way to do this? My specific concern with the code above is that the property names are stored as strings in a list, which would likely be missed when (for example) using a refactoring IDE to change one of these property names.
推荐答案
我还没有找到排除只读属性(即metaClass,class)的好方法,但是如果要设置值Foo实例中的所有属性也在Foo2实例中,您可以执行以下操作。
I haven't yet found a good approach for excluding the read-only properties (i.e., metaClass, class), but if you want to set the value of all properties in the Foo instance that are also in the Foo2 instance you could do the following.
class Foo {
def feck = "fe"
def arse = "ar"
def drink = "dr"
}
class Foo2 {
def feck = "fe2"
def arse = "ar2"
def drink = "dr2"
}
def f = new Foo()
def f2 = new Foo2()
f2.properties.each { prop, val ->
if(prop in ["metaClass","class"]) return
if(f.hasProperty(prop)) f[prop] = val
}
assert f.feck == "fe2"
assert f.arse == "ar2"
assert f.drink == "dr2"
这篇关于Groovy属性迭代的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!