Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What does .delegate mean in groovy?

Tags:

groovy

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.

like image 348
ripper234 Avatar asked Nov 14 '11 11:11

ripper234


People also ask

What is -> in Groovy?

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.

What is a delegate Groovy?

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.

How are closures defined in Groovy?

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.

What is it variable in Groovy?

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.


2 Answers

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.

like image 68
Dónal Avatar answered Sep 23 '22 21:09

Dónal


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 
like image 44
anish Avatar answered Sep 23 '22 21:09

anish