假设我有这门课程:
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()
,它会在myMethod()
实例上调用myClass1
,这将打印1.我想要的是调用相同的myMethodClosure
,但在不同的实例上,在这种情况下在myClass2
,所以它可以打印2.这可能吗?
我尝试过使用setDelegate()
,但它不起作用。我还看到封闭类中有字段thisObject
,但它没有setter,只有getter。
答案 0 :(得分:5)
有两种方法添加到Groovy以帮助序列化闭包,dehydrate
和rehydrate
。基本上,他们剥离(并重建)一个Closure的owner
,thisObject
和delegate
。在此示例中,您可以执行:
myMethodClosure.rehydrate( myClass2, myClass2, myClass2 )()
要获得输出2
,但是我对这样做很谨慎,因为这不是该方法的用途,可能会产生严重的意外后果。
更好的解决方案可能是编写一个工厂方法,该方法获取给定MyClass
实例的方法引用。可能还有其他更好的解决方案,但这取决于你所处的情况(我怀疑问题中的例子没有显示)
答案 1 :(得分:2)
我认为封闭“包括”要对其采取行动的封闭对象。在运行时,不可能在闭包内覆盖“this”。