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

  • 相关阅读:
    Android自定义之仿360Root大师水纹效果
    Android之TextView的Span样式源码剖析
    Android之TextView的样式类Span的使用详解
    随着ScrollView的滑动,渐渐的执行动画View
    仿微信主界面导航栏图标字体颜色的变化
    android自定义之 5.0 风格progressBar
    Android性能优化之内存篇
    Android性能优化之运算篇
    How to install Zabbix5.0 LTS version with Yum on the CentOS 7.8 system?
    How to install Zabbix4.0 LTS version with Yum on the Oracle Linux 7.3 system?
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3249209.html
Copyright © 2011-2022 走看看