При добавлении каррированного замыкания в качестве статического свойства метакласса Expando теряется значение параметра по умолчанию

Я сталкивался с этим как в Groovy 1.8.6, так и в 2.0.0.

Таким образом, все эти сценарии работают, как и ожидалось :

def ay = { one, two=[:] -> [one, two] }
def be = { one, two, three=[:] -> [one,two,three] }
def ayprime = ay.curry('PRIME')
def beprime = be.curry('PRIME')
def beprimer = be.curry('PRIME', 'PRIMER')

assert ay(1,2) == [1,2]
assert ay(1) == [1,[:]]
assert be(1,2,3) == [1,2,3]
assert be(1,2) == [1,2,[:]]

assert ayprime(1) == ['PRIME', 1]
assert ayprime() == ['PRIME', [:]]
assert beprime(1,2) == ['PRIME', 1, 2]
assert beprime(1) == ['PRIME', 1, [:]]
assert beprimer(1) == ['PRIME', 'PRIMER', 1]
assert beprimer() == ['PRIME', 'PRIMER', [:]]

. Как и это:

class Klass {
    static def smethod = { one, two=[:] -> [one, two] }
}
assert Klass.smethod(1,2) == [1, 2]
assert Klass.smethod(1) == [1, [:]]

Это также работает, как и ожидалось:

Klass.metaClass.static.aymethod << ay
assert Klass.aymethod(1) == [1, [:]]

Параметр по умолчанию для незавершенного закрытия сохраняется после присвоения Klass.

Однако это терпит неудачу:

Klass.metaClass.static.ayprimemethod << ayprime
assert Klass.ayprimemethod() == ['PRIME', [:]]

таким образом:

assert Klass.ayprimemethod() == ['PRIME', [:]]
             |               |
             [PRIME, null]   false

и аналогично, это не удается:

Klass.metaClass.static.beprimermethod << beprimer
assert Klass.beprimermethod() == ['PRIME', 'PRIMER', [:]]

таким образом:

assert Klass.beprimermethod() == ['PRIME', 'PRIMER', [:]]
         |                |
         |                false
         [PRIME, PRIMER, null]

С каррированными замыканиями значение параметра по умолчанию работает напрямую, но теряется, когда замыкание назначается статическим членом Klass.

Это похоже на ошибку. Я нигде не мог найти это поведение, задокументированное. Я что-то упускаю?

6
задан David Pisoni 20 July 2012 в 19:30
поделиться