2009-05-28 4 views

Respuesta

7

La forma idiomática maravilloso es salvar una referencia al método antiguo e invocar dentro de la nueva.

def oldPlus = Integer.metaClass.getMetaMethod("plus", [Integer] as Class[]) 

Integer.metaClass.plus = { Integer n -> 
    return oldPlus.invoke(oldPlus.invoke(delegate, n), 1)   
} 

assert 5 == 2 + 2 

Esto no es realmente tan bien documentado y yo estaba pensando en poner un post sobre este tema exacto, ya sea esta noche o mañana :).

1

Utilice esta "estropear", además de método:

Integer.metaClass.plus {Integer n -> delegate - (-n) - (-1)} 
assert 2+2 == 5 

No es sorprendente que el uso del operador '+' en la sobrecarga de métodos más resultará en stackoverflow, se requiere el uso de algo que no sea el operador '+'.

Otro mecanismo: utilice XOR o alguna magia de operador de bit.

Saludos, Peacefulfire

+0

Parece que Groovy 1.6 es lo suficientemente inteligente como para cambiar el delegado de llamadas - (-n) delegar + ny StackOverflowException todavía se lanza –

+0

hmm .. Mi versión es maravilloso 1.6 y Java 1.5.0_15 me encontré que en el maravilloso consola y funcionó bien sin tirar cualquier StackOverflowException Corrí en groovyshell y funcionó bien. ¿Cómo intentas ejecutar el script anterior? –

+0

Acabo de ver la respuesta publicada anteriormente por Ted. Creo que es una solución mucho mejor y general. +1 a Ted. –

Cuestiones relacionadas