【发布时间】: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