Groovy 在不同的对象上调用闭包?
假设我有这个班:Groovy 在不同的对象上调用闭包?,groovy,functional-programming,closures,Groovy,Functional Programming,Closures,假设我有这个班: class MyClass { int myInt MyClass(myInt) { this.myInt = myInt } def myMethod() { print this.myInt } } 在我的某处: def myClass1 = new MyClass(1) def myMethodClosure = myClass1.&myMethod def myClass2 = new
class MyClass {
int myInt
MyClass(myInt) {
this.myInt = myInt
}
def myMethod() {
print this.myInt
}
}
在我的某处:
def myClass1 = new MyClass(1)
def myMethodClosure = myClass1.&myMethod
def myClass2 = new MyClass(2)
现在,如果我调用myMethodClosure()
它将在myClass1
实例上调用myMethod()
,该实例将打印1。我想要的是调用相同的myMethodClosure
,但是在不同的实例上,在本例中是在myClass2
上,这样它就可以打印2。这可能吗
我尝试过使用
setDelegate()
,但它不起作用。我还看到,闭包类中有fieldthisObject
,但它没有setter,只有getter。我相信闭包“包括”要操作的封闭对象。在运行时不可能在闭包内部重写“this”。Groovy中添加了两种方法来帮助闭包的序列化,脱水和再水化。基本上,它们剥离(并重建)闭包的所有者
、此对象
和委托
。在本例中,您可以执行以下操作:
然而,为了获得输出2
,我会小心这样做,因为这不是该方法的目的,可能会有严重的不可预见的后果
更好的解决方案可能是编写一个工厂方法,为给定的MyClass
实例获取方法引用。可能还有其他更好的解决方案,但这取决于您所处的情况(我怀疑问题中的示例没有显示这一点)+1myMethodClosure
是一个闭包,它只对闭包的所有者调用该方法。虽然您可以这样做:myMethodClosure.rehydrate(myClass2,myClass2,myClass2)(
),但不能推荐它,因为它是一个明显的黑客;-)
myMethodClosure.rehydrate( myClass2, myClass2, myClass2 )()