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

  • 相关阅读:
    完成登录与注册页面的前端
    JavaScript 基础,登录验证
    CSS实例:图片导航块
    导航,头部,CSS基础
    web基础,用html元素制作web页面
    web基础
    timestamp与timedelta,管理信息系统概念与基础
    datetime处理日期和时间
    加载静态文件,父模板的继承和扩展
    开始Flask项目
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3249209.html
Copyright © 2011-2022 走看看