2012-07-20 17 views
6

Lo encontré tanto en Groovy 1.8.6 como en 2.0.0.Al agregar curry closure como propiedad estática con expando metaclass se pierde el valor de parámetro predeterminado

Así que estos escenarios de todo el trabajo como se esperaba:

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', [:]] 

Como se hace esto:

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

Este también funciona, como se esperaba:

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

El parámetro por defecto para el cierre incierto sobrevive a la asignación a Klass.

Sin embargo, este falla:

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

así:

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

y de manera similar, esta falla:

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

así:

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

Con los cierres al curry, el valor de parámetro predeterminado funciona directamente, pero se pierde cuando el cierre se asigna como miembro estático de Klass.

parece como un error. No pude encontrar este comportamiento documentado en ninguna parte. ¿Me estoy perdiendo de algo?

+0

Estoy viendo el mismo comportamiento. También lo probé como un método de instancia de clase (por lo que podría probarse mediante 'Klass.metaClass.ayprimemethod << ayprime; assert new Klass(). Ayprimemethod() == ['PRIME', [:]]', y encontré el mismo problema. Parece que deberías [presentar un error en JIRA] (http://jira.codehaus.org/secure/BrowseProject.jspa?id=10242). – OverZealous

+0

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

+0

Gracias por la explicación de currying :) –

Respuesta

0

Si el problema todavía te molesta, creo que esto podría ser una solución, hasta que se solucione en el tronco maravilloso. La forma de pitón de curry:

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') } 
Cuestiones relacionadas