Napotkałem to zarówno w Groovy 1.8.6, jak i 2.0.0.Dodawanie zamkniętego curry jako właściwości statycznej z metadlasem expando traci domyślną wartość parametru
Więc tych scenariuszy wszystkie prace zgodnie z oczekiwaniami:
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', [:]]
Jak to robi:
class Klass {
static def smethod = { one, two=[:] -> [one, two] }
}
assert Klass.smethod(1,2) == [1, 2]
assert Klass.smethod(1) == [1, [:]]
Ten działa również, zgodnie z oczekiwaniami:
Klass.metaClass.static.aymethod << ay
assert Klass.aymethod(1) == [1, [:]]
Domyślny parametr nieurodzajne zamknięcie przetrwa przypisanie do Klass
.
Jednak ten zawiedzie:
Klass.metaClass.static.ayprimemethod << ayprime
assert Klass.ayprimemethod() == ['PRIME', [:]]
wygląda następująco:
assert Klass.ayprimemethod() == ['PRIME', [:]]
| |
[PRIME, null] false
i podobnie, to się nie powiedzie:
Klass.metaClass.static.beprimermethod << beprimer
assert Klass.beprimermethod() == ['PRIME', 'PRIMER', [:]]
wygląda następująco:
assert Klass.beprimermethod() == ['PRIME', 'PRIMER', [:]]
| |
| false
[PRIME, PRIMER, null]
W przypadku zamkniętych zamknięć domyślna wartość parametru działa bezpośrednio, ale zostaje utracona, gdy zamknięcie jest przypisane jako statyczny element składowy Klass
.
Ten wydaje się być jak błąd. Nie mogłem znaleźć tego zachowania udokumentowanego nigdzie. Czy czegoś brakuje?
Widzę to samo zachowanie. Przetestowałem również to jako metodę klasy-instancji (dzięki czemu można ją przetestować za pomocą 'Klass.metaClass.ayprimemethod << ayprime; potwierdź nowe Klass(). Ayprimemethod() == ['PRIME', [:]]'), i znalazłem ten sam problem. Wygląda na to, że powinieneś [zgłosić błąd w JIRA] (http://jira.codehaus.org/secure/BrowseProject.jspa?id=10242). – OverZealous
Gotowe. http://jira.codehaus.org/browse/GROOVY-5621 –
Dzięki za wyjaśnienie zapiekania :) –