Reputation: 230406
I found this code snippet:
def say = {println m}
say.delegate = [m:2]
say()
That apperantly prints 2. How does it work? Where can find documentation about .delegate
? Google led me to the Delegate Transformation page that doesn't mention .delegate
at all.
Upvotes: 41
Views: 14390
Reputation: 187419
The delegate of a closure is an object that is used to resolve references that cannot be resolved within the body of the closure itself. If your example was written like this instead:
def say = {
def m = 'hello'
println m
}
say.delegate = [m:2]
say()
It prints 'hello', because m
can be resolved within the closure. However, when m
is not defined within the closure,
def say = {
println m
}
say.delegate = [m:2]
say()
the delegate
is used to resolve the reference, and in this case the delegate
is a Map
that maps m
to 2.
Upvotes: 61
Reputation: 7422
Three property of closures, are this, owner, and delegate, In general delegate is set to owner
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
}
}
prints
this is ConsoleScript0@11d20d3, super:groovy.lang.Script
owner is ConsoleScript0@11d20d3, super:groovy.lang.Script
delegate is ConsoleScript0@11d20d3, super:groovy.lang.Script
this is ConsoleScript0@11d20d3, super:groovy.lang.Script
owner is ConsoleScript0$_run_closure1@caea19, super:groovy.lang.Closure
delegate is ConsoleScript0$_run_closure1@caea19, super:groovy.lang.Closure
Upvotes: 14