2009-05-28 8 views

risposta

7

Il modo idiomatica scanalato è quello di salvare un riferimento al vecchio metodo e richiamare all'interno della nuova.

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 

Questo non è in realtà che ben documentato e stavo pensando di mettere su un post su questo argomento esatto o stasera o domani :).

1

Utilizzare questo a "rovinare" più metodo:

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

Non sorprende che, utilizzando '+' operatore in sovraccarico metodo più si tradurrà in StackOverflow, è necessario utilizzare qualcosa di diverso allora '+' operatore.

Altri meccanismi: utilizzare XOR o un po 'di magia dell'operatore bit.

saluti, Peacefulfire

+0

Sembra che Groovy 1.6 è abbastanza intelligente da modificare la chiamata delegato - (-n) di delegare + n ed StackOverflowException è ancora gettato –

+0

hmm .. La mia versione è Groovy 1.6 e Java 1.5.0_15 correvo che in Groovy console e funzionava bene senza lanciare StackOverflowException Ho eseguito in groovyshell e funzionava bene. Come stai cercando di eseguire lo script sopra? –

+0

Ho appena visto la risposta postata da Ted. Penso che sia molto meglio e una soluzione generale. +1 a Ted. –

Problemi correlati