ripper234
ripper234

Reputation: 230406

What does .delegate mean in 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.

Upvotes: 41

Views: 14390

Answers (2)

Dónal
Dónal

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

anish
anish

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

Related Questions