在 groovy 1.8.6 中,我试图做这样的事情:
class Greeter {
def sayHello() {
this.metaClass.greeting = { System.out.println "Hello!" }
greeting()
}
}
new Greeter().sayHello()
这没有用:
groovy.lang.MissingPropertyException: No such property: greeting for class: groovy.lang.MetaClassImpl
经过一番尝试,我发现将 self 的引用传递给该方法确实有效。所以,基本上我想出的是:
class Greeter {
def sayHello(self) {
assert this == self
// assert this.metaClass == self.metaClass
self.metaClass.greeting = { System.out.println "Hello!" }
greeting()
}
}
def greeter = new Greeter()
greeter.sayHello(greeter)
最奇怪的是assert this == self
实际通过了,这意味着它们是同一个实例……对吧?默认值toString
似乎也证实了这一点。
另一方面,assert this.metaClass == self.metaClass
失败:
assert this.metaClass == self.metaClass
| | | |
| | | org.codehaus.groovy.runtime.HandleMetaClass@50c69133[groovy.lang.MetaClassImpl@50c69133[class Greeter]]
| | Greeter@1c66d4b3
| false
groovy.lang.MetaClassImpl@50c69133[class Greeter]
为什么 self.metaClass 被包裹在 HandleMetaClass 中,而 this.metaClass 不是?另外,如何在不传递对 self 的引用的情况下使第一个示例工作?