.delegate在groovy中意味着什么?

rip*_*234 38 groovy

我找到了这段代码:

def say = {println m}
say.delegate = [m:2]
say()
Run Code Online (Sandbox Code Playgroud)

这显然是打印2.它是如何工作的?哪里可以找到有关的文档.delegate?谷歌引导我进入了代表转换页面,完全没有提到.delegate.

Dón*_*nal 59

闭包的委托是一个对象,用于解析在闭包本身内部无法解析的引用.如果您的示例是这样写的:

def say = {
  def m = 'hello'
  println m
}
say.delegate = [m:2]
say()
Run Code Online (Sandbox Code Playgroud)

它打印'hello',因为m可以在闭包内解决.但是,如果m没有在闭包内定义,

def say = {
  println m
}
say.delegate = [m:2]
say()
Run Code Online (Sandbox Code Playgroud)

delegate用于解析所述引用,并且在这种情况下delegate是一个Map映射m到2.

  • @thenaglecode我觉得你的意思是'def say = {def m = it?:'你好'; println m}` (2认同)

ani*_*ish 12

闭包的三个属性,是这个,所有者和委托,一般委托设置为所有者

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
  }
}
Run Code Online (Sandbox Code Playgroud)

版画

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
Run Code Online (Sandbox Code Playgroud)

  • 默认情况下可能是所有者,但驱动Groovy DSL的原因是您可以将委托重新分配给任何对象 (4认同)