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.
It is used to separate where you declare bindings for your closure from the actual code, eg: def myClosure = { x, y -> x + y } the part before -> declares that the closure has two arguments named x and y while the second part is the code of the closure.
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.
A closure in Groovy is an open, anonymous, block of code that can take arguments, return a value and be assigned to a variable. A closure may reference variables declared in its surrounding scope.
Advertisements. Variables in Groovy can be defined in two ways − using the native syntax for the data type or the next is by using the def keyword. For variable definitions it is mandatory to either provide a type name explicitly or to use "def" in replacement. This is required by the Groovy parser.
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.
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With