如何使闭包有自己的变量副本-does groovy有lambda

时间:2016-01-20 01:54:18

标签: groovy closures

groovy中的命令是什么,以确保类变量不受闭包影响?正如我们所知,闭包捕获了它所包含的环境。因此,如果我有一个闭包,例如递增一个整数类变量,那么该变量将针对该类的更改而更改。我想要的是一个闭包具有自己的变量COPY,因此它不会影响类变量,是否可能?在Objective C中,例如我们将使用__Block命令,这将使块能够更改捕获变量的值,现在我要求__Block与我的情况相反,因为闭包已经改变了它们作为范围的变量。

让我们看看我想要的一个明确的例子:

def class myCoolClass {
    def x=1

    def myMethodThatReturnsClosure(){
        //lets return a closure who's scope will include the x=1
        myClosure
    }

    def showMeXFromMyCoolClass(){
        println "this is x from myCoolClass:$x"
    }

    def myClosure={
        println "im printing x:$x"
        //lets change x now from within closure
        x++
    }

}


def x = new myCoolClass();

def c=x.myMethodThatReturnsClosure();
c(); //we are changing x ...x = 1
c(); //we are changing x again  ...x = 2
c(); //we are changing x again ...x = 3

x.showMeXFromMyCoolClass(); //...x = 4
//i dont want x to be 4 in the last call, i want x to be 1. 
//i want it unchanged. how to tell closure to take its own copy

我在groovy中意识到闭包知道它的环境。它围绕着它所包含的功能“关闭”。那么在groovy中有lambda吗?我认为lambda不知道它的环境对吗?但是让我说我​​只想要变量不知道它的环境和其他人应该,然后lambda不会好。

1 个答案:

答案 0 :(得分:1)

您的示例代码无效Groovy语法。您可能想要调试它并使用修复程序更新示例。不过,你明白了。

使闭包使用类变量副本的一种方法是制作变量的副本,并在闭包中使用它而不是x。:

def myMethodThatReturnsClosure() {
   def myX = x

   {
       println "im printing x:$myX"
       myX++
   }
}

这假设变量是一个基元,该grooy以不同的方式处理,以便复制。否则,新变量只是对原始变量的引用。在后一种情况下,您必须克隆该对象才能获得副本。