【问题标题】:How to make closure have its own copy of variable -does groovy have lambda如何使闭包拥有自己的变量副本 - groovy 是否有 lambda
【发布时间】:2016-04-25 17:14:59
【问题描述】:

在 groovy 中确保类变量不受闭包影响的命令是什么?正如我们所知,闭包捕获了它所在的环境。因此,例如,如果我有一个闭包递增一个整数类变量,那么该变量会针对该类进行更改。我想要的是闭包拥有自己的变量副本,因此它不会影响类变量。可能吗?例如,在 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 就不好了。

【问题讨论】:

  • 以这种方式编写代码将无法调试,将来你会恨你现在。为什么不将参数传递给返回闭包的方法?
  • 感谢您的反馈,这只是我想做的一个例子,我做了。它在 Groovy 版本:2.4.1 JVM:1.8.0_45 上运行良好,只需剪切和粘贴。

标签: groovy closures


【解决方案1】:

您的示例代码不是有效的 Groovy 语法。您可能想要调试它并使用修复更新示例。不过,你的意思已经明白了。

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

def myMethodThatReturnsClosure() {
   def myX = x

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

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

【讨论】:

  • 顺便说一句,我使用 Groovy 版本:2.4.1 JVM:1.8.0_45,它可以很好地剪切和粘贴。我希望有一个像目标 c 中的推荐来定义关闭的范围。我知道现在没有。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-18
  • 1970-01-01
  • 1970-01-01
  • 2017-07-15
  • 1970-01-01
  • 2012-01-25
相关资源
最近更新 更多