2012-07-20 14 views
6

L'ho rilevato sia in Groovy 1.8.6 che in 2.0.0.L'aggiunta di chiusura al curry come proprietà statica con metaclassi expando perde il valore del parametro predefinito

Quindi questi scenari tutti i lavori come previsto:

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

come fa questo:

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

Questo funziona anche, come previsto:

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

Il parametro predefinito la chiusura senza fretta sopravvive all'assegnazione allo Klass.

Tuttavia, questo fallisce:

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

così:

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

e allo stesso modo, questo viene a mancare:

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

così:

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

Con le chiusure intrecciate, il valore del parametro predefinito funziona direttamente, ma viene perso quando la chiusura viene assegnata come membro statico di Klass.

Questo sembra un errore. Non sono riuscito a trovare questo comportamento documentato da nessuna parte. Mi sto perdendo qualcosa?

+0

Sto vedendo lo stesso comportamento. L'ho anche testato come metodo di istanza di classe (quindi potrebbe essere testato tramite 'Klass.metaClass.ayprimemethod << ayprime; asserire nuovo Klass(). Ayprimemethod() == ['PRIME', [:]]'), e ho trovato lo stesso problema. Sembra che dovresti [presentare un bug in JIRA] (http://jira.codehaus.org/secure/BrowseProject.jspa?id=10242). – OverZealous

+0

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

+0

Grazie per la spiegazione del curry :) –

risposta

0

Se il problema è ancora fastidioso, penso che questo potrebbe essere una soluzione alternativa, fino a quando non viene risolto nel bagagliaio groovy. Il modo pitone per 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') } 
Problemi correlati