Поведение метакласса 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
Другие вопросы по тегам