What does .delegate mean in groovy?

后端 未结 2 821
小鲜肉
小鲜肉 2020-12-08 13:04

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 docu

相关标签:
2条回答
  • 2020-12-08 13:49

    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
    
    0 讨论(0)
  • 2020-12-08 13:55

    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.

    0 讨论(0)
提交回复
热议问题