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()
,但它不起作用。我还看到,闭包类中有field
thisObject
,但它没有setter,只有getter。

我相信闭包“包括”要操作的封闭对象。在运行时不可能在闭包内部重写“this”。

Groovy中添加了两种方法来帮助闭包的序列化,
脱水和
再水化。基本上,它们剥离(并重建)闭包的
所有者
此对象
委托
。在本例中,您可以执行以下操作:

然而,为了获得输出
2
,我会小心这样做,因为这不是该方法的目的,可能会有严重的不可预见的后果


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

+1
myMethodClosure
是一个闭包,它只对闭包的
所有者调用该方法。虽然您可以这样做:
myMethodClosure.rehydrate(myClass2,myClass2,myClass2)(
),但不能推荐它,因为它是一个明显的黑客;-)
myMethodClosure.rehydrate( myClass2, myClass2, myClass2 )()