调用不同对象的闭包?

时间:2013-11-04 09:43:30

标签: 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 MyClass(2)

现在,如果我致电myMethodClosure(),它会在myMethod()实例上调用myClass1,这将打印1.我想要的是调用相同的myMethodClosure,但在不同的实例上,在这种情况下在myClass2,所以它可以打印2.这可能吗?

我尝试过使用setDelegate(),但它不起作用。我还看到封闭类中有字段thisObject,但它没有setter,只有getter。

2 个答案:

答案 0 :(得分:5)

有两种方法添加到Groovy以帮助序列化闭包,dehydraterehydrate。基本上,他们剥离(并重建)一个Closure的ownerthisObjectdelegate。在此示例中,您可以执行:

myMethodClosure.rehydrate( myClass2, myClass2, myClass2 )()

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

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

答案 1 :(得分:2)

我认为封闭“包括”要对其采取行动的封闭对象。在运行时,不可能在闭包内覆盖“this”。