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

如何使闭包有自己的变量副本-groovy有lambda吗,groovy,closures,Groovy,Closures,groovy中确保类变量不受闭包影响的命令是什么?正如我们所知,闭包捕获了它所包装的环境。例如,如果我有一个增加一个整数类变量的闭包,那么该类的变量就改变了。我想要的是闭包拥有自己的变量副本,这样它就不会影响类变量。可能吗?例如,在目标C中,我们将使用_Block命令,这将使块能够更改捕获变量的值。现在,在我的例子中,我要求的是与_块相反的结果,因为闭包已经在改变它们的作用域中的变量 让我们看一个我想要的清晰示例: def class myCoolClass { def x=1

groovy中确保类变量不受闭包影响的命令是什么?正如我们所知,闭包捕获了它所包装的环境。例如,如果我有一个增加一个整数类变量的闭包,那么该类的变量就改变了。我想要的是闭包拥有自己的变量副本,这样它就不会影响类变量。可能吗?例如,在目标C中,我们将使用_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就不好了

示例代码不是有效的Groovy语法。您可能需要调试它并使用修复程序更新示例。尽管如此,你还是把你的观点讲明白了

使闭包使用类变量副本的一种方法是创建变量副本并使用它,而不是在闭包中使用
x

def myMethodThatReturnsClosure() {
   def myX = x

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

这假设变量是一个原语,grooy会对其进行不同的处理,从而生成一个副本。否则,新变量将只是对原始变量的引用。在后一种情况下,您必须克隆对象才能获得副本。

以这种方式编写代码将无法调试,而且将来您现在会讨厌您。为什么不把一个参数传递给一个返回闭包的方法呢?谢谢你的反馈,这只是我想做的一个例子,我自己编的。它在Groovy版本2.4.1 JVM:1.8.0_45上运行良好,只需剪切粘贴即可。顺便说一句,我使用Groovy版本2.4.1 JVM:1.8.0_45,剪切粘贴即可。我希望在目标c中有一个类似的例子来定义关闭的范围。我知道现在没有了。