2009-05-28 10 views

Odpowiedz

7

Groovy idiomatyczne sposobem jest zapisanie odniesienie do starej metody i wywołać go wewnątrz nowego.

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 

To nie jest tak dobrze udokumentowane i planowałem napisanie postu na blogu na ten temat albo dziś wieczorem, albo jutro :).

1

Służy do „psuć” oraz metoda:

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

Nic dziwnego, że za pomocą „+” operator przeciążenia metody plusa spowoduje StackOverflow, jest wymagane do korzystania z czegoś innego następnie operatora „+”.

Inny mechanizm: Użyj XOR lub trochę magii operatora.

Pozdrawiam, Peacefulfire

+0

Wygląda na to, że Groovy 1.6 jest na tyle sprytny, aby zmienić delegata połączenia - (-n), aby delegować + n, a wyjątek StackOverflowException wciąż jest wyświetlany –

+0

hmm .. Moja wersja to Groovy 1.6 i Java 1.5.0_15 Uruchomiłem to w groovy konsola i wszystko działało bez rzucania żadnego StackOverflowException Pobiegłem w groovyshell i wszystko działało dobrze. Jak próbujesz uruchomić powyższy skrypt? –

+0

Właśnie zobaczyłem odpowiedź zamieszczoną powyżej przez Teda. Myślę, że to o wiele lepsze i ogólne rozwiązanie. +1 do Teda. –

Powiązane problemy