zoukankan      html  css  js  c++  java
  • 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 = closure
    context = closure.call(this)
    println context[0].class.name

  • 相关阅读:
    BZOJ 1492 [NOI2007]货币兑换Cash
    BZOJ 2285 [Sdoi2011]保密
    BZOJ 2962 序列操作
    BZOJ 3197 [Sdoi2013]assassin
    BZOJ 3131 [Sdoi2013]淘金
    BZOJ 3532 [Sdoi2014]Lis
    BZOJ 1923 [Sdoi2010]外星千足虫
    BZOJ 4855 [Jsoi2016]轻重路径
    BZOJ 4289 PA2012 Tax
    微信开发之 微信支付
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3249209.html
Copyright © 2011-2022 走看看