2012-07-20 23 views
6

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?

+0

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

+0

Gotowe. http://jira.codehaus.org/browse/GROOVY-5621 –

+0

Dzięki za wyjaśnienie zapiekania :) –

Odpowiedz

0

Jeśli problem nadal Cię trapi, myślę, że może to być obejście problemu, dopóki nie zostanie naprawiony w pniu. Pythonowy sposób curry rzeczy:

def ayprime = { x -> x ? ay('PRIME', x) : ay('PRIME') } 
def beprime = be.curry('PRIME') 
def beprimer = { x -> x ? be('PRIME', 'PRIMER', x) : be('PRIME', 'PRIMER') }