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

  • 相关阅读:
    全排列问题(递归&非递归&STL函数)
    基于python的机器学习开发环境安装(最简单的初步开发环境)
    X分钟速成Python
    X分钟速成Python3
    Python6
    Python5
    Error[Pe020]: identifier "FILE" is undefined
    串口 ------ 硬件流控
    STM32F103 ------ 时钟配置
    git
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3249209.html
Copyright © 2011-2022 走看看