调用不同对象的闭包?

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.

tim*_*tes 5

Groovy添加了两个方法来帮助闭包序列化,dehydrate以及rehydrate.基本上,他们剥离(并重建)一个Closure owner,thisObjectdelegate.在此示例中,您可以执行以下操作:

myMethodClosure.rehydrate( myClass2, myClass2, myClass2 )()
Run Code Online (Sandbox Code Playgroud)

为了获得输出2,但是我对这样做很谨慎,因为它不是该方法的用途,并且可能会产生严重的意外后果.

一个更好的解决方案可能是编写一个工厂方法,该方法获取给定实例的方法引用MyClass.可能还有其他更好的解决方案,但这取决于你所处的情况(我怀疑问题中的例子没有显示)