m3t*_*man 2 groovy closures functional-programming
假设我有这个课程:
class MyClass {
int myInt
MyClass(myInt) {
this.myInt = myInt
}
def myMethod() {
print this.myInt
}
}
Run Code Online (Sandbox Code Playgroud)
在某处我有:
def myClass1 = new MyClass(1)
def myMethodClosure = myClass1.&myMethod
def myClass2 = new MyClass(2)
Run Code Online (Sandbox Code Playgroud)
现在,如果我把myMethodClosure()它会调用myMethod()上myClass1的实例,将打印1.我想是调用相同myMethodClosure,但在不同的情况下,在这种情况下,就myClass2这样就可以打印2,这可能吗?
我尝试过使用setDelegate(),但它不起作用.我也看到thisObject封闭类中有字段,但它没有setter,只有getter.
Groovy添加了两个方法来帮助闭包序列化,dehydrate以及rehydrate.基本上,他们剥离(并重建)一个Closure owner,thisObject和delegate.在此示例中,您可以执行以下操作:
myMethodClosure.rehydrate( myClass2, myClass2, myClass2 )()
Run Code Online (Sandbox Code Playgroud)
为了获得输出2,但是我对这样做很谨慎,因为它不是该方法的用途,并且可能会产生严重的意外后果.
一个更好的解决方案可能是编写一个工厂方法,该方法获取给定实例的方法引用MyClass.可能还有其他更好的解决方案,但这取决于你所处的情况(我怀疑问题中的例子没有显示)