2009-05-28 3 views

Répondre

7

La façon dont idiomatiques groovy est de sauver une référence à l'ancienne méthode et l'appeler à l'intérieur du nouveau.

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 

Ce n'est pas vraiment bien documenté et je prévoyais de publier un billet sur ce sujet exact ce soir ou demain :).

1

Utilisez cette option pour « gâter » ainsi que la méthode:

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

Sans surprise, en utilisant l'opérateur « + » en surcharge méthode, plus entraînera StackOverflow, il est nécessaire d'utiliser quelque chose autre que l'opérateur « + ».

Autre mécanisme: Utilisez XOR ou un peu de magie opérateur.

Cordialement, Peacefulfire

+0

Il semble que Groovy 1.6 est assez intelligent pour changer le délégué d'appel - (-n) pour déléguer + n et StackOverflowException est toujours levé –

+0

hmm .. Ma version est Groovy 1.6 et Java 1.5.0_15 J'ai couru cela dans groovy console et ça a bien fonctionné sans jeter StackOverflowException J'ai couru dans groovyshell et ça s'est bien passé. Comment essayez-vous de courir au-dessus du script? –

+0

Juste vu la réponse postée ci-dessus par Ted. Je pense que c'est beaucoup mieux et une solution générale. +1 à Ted. –

Questions connexes