簡體   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