Groovy中Closure的this到底指向谁?

Groovy in Action(中文版)第136页明确说Closure的this指向Closure自己。并且从代码注释处作者也是这样理解的:

class Mother{
    int field = 1
    int foo(){
        return 2
    }

    Closure birth(param){
        def local = 3
        def closure = { caller->
            [
                this,
                field,
                foo(),
                local,
                param,
                caller,
                this.owner
            ]
        }
        return closure
    }
}

Mother julia  = new Mother()

closure = julia.birth(4)
context = closure.call(this)
println context[0].class.name            //(4) Script

............................................

assert context[6] instanceof Mother //作者认为this指向自己,所以this.owner指向Mother


但是,上面的代码实际是错误的,我用1.0和2.1分别运行,都是一样的结果。this,也就是context[0]是Mother的this,而不是Closeure的。并且this.owner报错,提示Mother找不到属性owner.

其实Closure中引用this是它所在的上下文的this.对于上例其实就是Mother.this,是closure的owner,这也是Closure的delegate认值.要想在Closure是引用自己,只有引用delegate,然后在外部调用时将closure的delegate指向自己:

class Mother{    int field = 1    int foo(){        return 2    }    Closure birth(param){        def local = 3        def closure = { caller->            [                delegate,                field,                this.foo(),                local,                param,                caller,                delegate.owner            ]        }        return closure    }}Mother julia  = new Mother()closure = julia.birth(4)closure.delegate = closurecontext = closure.call(this)println context[0].class.name

相关文章

背景:    8月29日,凌晨4点左右,某服务告警,其中一个...
https://support.smartbear.comeadyapi/docs/soapui/steps/g...
有几个选项可用于执行自定义JMeter脚本并扩展基线JMeter功能...
Scala和Java为静态语言,Groovy为动态语言Scala:函数式编程,...
出处:https://www.jianshu.com/p/ce6f8a1f66f4一、一些内部...
在运行groovy的junit方法时,报了这个错误:java.lang.Excep...