Что означает .delegate в groovy?
Я нашел этот фрагмент кода:
def say = {println m}
say.delegate = [m:2]
say()
Что печатает отпечатки 2. Как это работает? Где можно найти документацию о .delegate
? Google привел меня на страницу "Преобразование делегатов", которая вообще не упоминает .delegate
.
Ответы
Ответ 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