Groovy:如何记住执行之间的闭包变量值?

T.D*_*ski 2 groovy closures

我希望能够做到这样的事情:

def closure = { 
  def a // create new variable, but ONLY if not created yet
  if (a == null) {
    a = 0
  }
  a++
  print a
}

closure() // prints 1
closure() // prints 2
closure() // prints 3, etc...
Run Code Online (Sandbox Code Playgroud)

我想在闭包中创建INSIDE变量,而不是在外部作用域中.

epi*_*ian 7

这可能是无效的答案,但外部范围不需要是全局的; 它可以在一个函数内部,或者甚至是一个匿名函数,如:

def closure = {
    def a
    return { 
        if (a == null) a = 1
        println a++ 
    }
}()

closure() // prints 1
closure() // prints 2
closure() // prints 3, etc...
Run Code Online (Sandbox Code Playgroud)

周围匿名函数的目的只是为a变量赋予范围而不污染全局范围.请注意,该函数在定义后立即进行评估.

这样,范围a对于该闭包实际上是"私有的"(因为它是唯一一个在评估外部函数后引用它的人).但是变量是第一次closure()调用之前定义的,所以这可能不是你想要的.

  • +1天才:-)你所需要的只是`def closure = {a = 1; { - > println a ++}}()` (4认同)