1

在尝试 ExpandMetaClass 时,我遇到了这种行为:

class A {}

A.metaClass.foo = { 0 }
A.metaClass.foo = { 1 }
println (new A().foo())
A.metaClass.foo = { 2 }
println (new A().foo())

Collection.metaClass.foo = { 0 }
Collection.metaClass.foo = { 1 }
println ([].foo())
Collection.metaClass.foo = { 2 }
println ([].foo())

哪个打印

1
2
1
1

这似乎不一致。这种行为背后的原因是什么?

4

1 回答 1

2

听起来像一个错误。你应该填写一个JIRA

它适用于每个实例:

class A {}

A.metaClass.foo = { 0 }
A.metaClass.foo = { 1 }
assert (new A().foo()) == 1
A.metaClass.foo = { 2 }
assert (new A().foo()) == 2

Collection.metaClass.foo = { 0 }
Collection.metaClass.foo = { 1 }
assert ([].foo()) == 1

def j = []
j.getMetaClass().foo = { 2 }
assert (j.foo()) == 2
于 2014-06-04T15:05:42.027 回答