繁体   English   中英

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

[英]Groovy: How to remember closure's variable value between executions?

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

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...

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

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

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

closure() // prints 1
closure() // prints 2
closure() // prints 3, etc...

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

这样,范围a是有效地“私人”来表示的封闭件(因为它是唯一一个与它的一个引用一旦外部函数已经被评估)。 但是变量是第一次调用closure() 之前定义的,所以这可能不是你想要的。

你可以这样做:

def closure = { 
  if( !delegate.hasProperty( 'a' ) ) {
    println "Adding a to delegate"
    delegate.metaClass.a = 0
  }
  delegate.a++
  println delegate.a
}

closure() // prints 1
closure() // prints 2
closure() // prints 3, etc...

但这是一个令人讨厌的副作用,如果你不小心它会咬你(并且任何类型的多线程都会失败)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM