【问题标题】:Trying to understand runtime closure/method overwriting in Groovy试图理解 Groovy 中的运行时闭包/方法覆盖
【发布时间】:2018-02-17 16:22:58
【问题描述】:

我编写了以下代码来学习 groovy 中的闭包/方法覆盖。我无法理解它的行为。

class AClass {
    def closure1 = { ->  println "hello from closure1 - ${this.toString()}" }

    def closure2 = { c1 ->
        print "closure2 { \n    "
        c1()
        println "}"
    }
}

def obj = new AClass()
print "1: "
obj.closure1()

//over write closure1
obj.metaClass.closure1 = { -> println "hello from *** overridden closure1 *** - ${this.toString()}".toUpperCase()}
print "\n2: "
obj.closure1() //To confirm closure1 was indeed overwritten

//call closure2
print "\n3: "
obj.closure2 (obj.closure1)
print "\n4: "
obj.closure2 {obj.closure1()}

我希望这两个 closure2 调用会产生相同的结果,但显然它们不会。

下面是我运行代码的结果。

1: hello from closure1 - AClass@d706f19

2: HELLO FROM *** OVERRIDDEN CLOSURE1 *** - TESTMTDOVERRIDE@BE64738

3: closure2 { 
    hello from closure1 - AClass@d706f19
}

4: closure2 { 
    HELLO FROM *** OVERRIDDEN CLOSURE1 *** - TESTMTDOVERRIDE@BE64738
}

【问题讨论】:

    标签: groovy metaclass overriding


    【解决方案1】:

    这里有两个不同的东西...一个变量closure1 保存一个闭包,一个方法closure1 通过闭包添加到元类...

    obj.closure2 (obj.closure1)
    

    调用closure2,并传入变量

    obj.closure2 {obj.closure1()}
    

    传递一个调用元类中的闭包的闭包

    它们是非常不同的东西

    你只是叫他们一样

    【讨论】:

    • 啊……我终于明白了。我对方法和属性(闭包对象)感到困惑。谢谢!
    猜你喜欢
    • 2015-04-30
    • 1970-01-01
    • 1970-01-01
    • 2015-08-28
    • 1970-01-01
    • 2010-12-28
    • 1970-01-01
    • 2014-05-25
    • 1970-01-01
    相关资源
    最近更新 更多