Подтвердить что ты не робот

Что означает .delegate в groovy?

Я нашел этот фрагмент кода:

def say = {println m}
say.delegate = [m:2]
say()

Что печатает отпечатки 2. Как это работает? Где можно найти документацию о .delegate? Google привел меня на страницу "Преобразование делегатов", которая вообще не упоминает .delegate.

4b9b3361

Ответ 1

Делегат закрытия - это объект, который используется для разрешения ссылок, которые не могут быть разрешены в теле самого закрытия. Если ваш пример был написан следующим образом:

def say = {
  def m = 'hello'
  println m
}
say.delegate = [m:2]
say()

Он печатает 'hello', потому что m может быть разрешен в закрытии. Однако, когда m не определено в пределах замыкания,

def say = {
  println m
}
say.delegate = [m:2]
say()

the delegate используется для разрешения ссылки, и в этом случае delegate является Map, который отображает m в 2.

Ответ 2

Три свойства замыканий, это, владелец и делегат. В общем делетете присваивается владелец

def testClosure(closure) {
  closure()
}
testClosure() {
  println "this is " + this + ", super:" + this.getClass().superclass.name
  println "owner is " + owner + ", super:" + owner.getClass().superclass.name
  println "delegate is " + delegate + ", super:" + delegate.getClass().superclass.name

  testClosure() {
    println "this is " + this + ", super:" + this.getClass().superclass.name
    println "owner is " + owner + ", super:" + owner.getClass().superclass.name
    println "delegate is " + delegate + ", super:" + delegate.getClass().superclass.name
  }
}

печатает

this is [email protected], super:groovy.lang.Script
owner is [email protected], super:groovy.lang.Script
delegate is [email protected], super:groovy.lang.Script
this is [email protected], super:groovy.lang.Script
owner is [email protected], super:groovy.lang.Closure
delegate is [email protected], super:groovy.lang.Closure