Поведение метакласса Expando зависит от того, определен ли класс пользователем или нет?
Экспериментируя с 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
Который не кажется последовательным. В чем причина такого поведения?
1 ответ
Решение
Похоже, ошибка. Вы должны заполнить 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