【问题标题】:Groovy closure delegate define parameter?Groovy闭包委托定义参数?
【发布时间】: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);
}

【问题讨论】:

    标签: groovy closures


    【解决方案1】:

    默认情况下,Groovy 会在访问委托之前查看闭包的作用域,因此要在委托中设置您想要的内容,这可能不是您想要的...幸运的是,您可以更改解析策略:

    greetingClosure.resolveStrategy = Closure.DELEGATE_FIRST
    

    将其放在该行之后

    greetingClosure.delegate = myGroovyGreeter
    

    你应该得到你期望的输出

    【讨论】:

      猜你喜欢
      • 2019-06-23
      • 2019-10-08
      • 2018-10-29
      • 2013-07-07
      • 2014-06-20
      • 2013-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多