【发布时间】:2017-05-04 16:21:54
【问题描述】:
我正在学习 groovy 委托
class GroovyGreeter {
String greeting = "Default greeting"
def printGreeting(){println "Greeting: $greeting"}
}
def myGroovyGreeter = new GroovyGreeter()
myGroovyGreeter.printGreeting() // default
myGroovyGreeter.greeting = "My custom outer greeting"
myGroovyGreeter.printGreeting()
def greetingClosure = {
println greeting //equal to delegate.greeting
println this.class
println owner.class
println delegate.class
greeting = "Setting the greeting from a closure" // this is ??????
printGreeting()
delegate.greeting = "setting the greeting from delegate.greeting..."
printGreeting()
}
greetingClosure.delegate = myGroovyGreeter
greetingClosure() // This works as `greeting` is a property of the delegate
操作系统:windows10 终端:cywin groovy:2.4.10 jvm 1.8
Greeting: Default greeting
Greeting: My custom outer greeting
My custom outer greeting
class closureuda
class closureuda
class GroovyGreeter
Greeting: My custom outer greeting
Greeting: setting the greeting from delegate.greeting...
我很困惑为什么闭包中的 greeting 变量不等于 delegate.greeting
当我反编译代码发现——greeting被定义为一个局部变量:
private static /* synthetic */ CallSiteArray $createCallSiteArray() {
String[] strArr = new String[1]; // this is greeting definition
strArr[0] = "printGreeting";
return new CallSiteArray(closureuda$_run_closure1.class, strArr);
}
【问题讨论】: