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不会好。
答案 0 :(得分:1)
您的示例代码无效Groovy语法。您可能想要调试它并使用修复程序更新示例。不过,你明白了。
使闭包使用类变量副本的一种方法是制作变量的副本,并在闭包中使用它而不是x
。:
def myMethodThatReturnsClosure() {
def myX = x
{
println "im printing x:$myX"
myX++
}
}
这假设变量是一个基元,该grooy以不同的方式处理,以便复制。否则,新变量只是对原始变量的引用。在后一种情况下,您必须克隆该对象才能获得副本。