2010-12-10 32 views
9

Je ne fais que jouer avec la programmation de la métaclasse dans Groovy. Mais tout à coup, je faisais face à un petit problème que je ne pouvais pas me travailler ...Ajouter une méthode à la métaclasse

Voici le script simple:

// define simple closure 
def printValueClosure = { 
println "The value is: '$delegate'" 
} 

String.metaClass.printValueClosure = printValueClosure 

// works fine 
'variable A'.printValueClosure() 



// define as method 
def printValueMethod(String s){ 
println "The value is: '$s'" 
} 

// how to do this!? 
String.metaClass.printValueMethod = this.&printValueMethod(delegate) 

'variable B'.printValueMethod() 

Est-il possible d'utiliser la méthode, mais définir le premier paramètre à l'appel objet? l'utilisation de délégué ne semble pas fonctionner ... L'affectation de méthodes qui ne font pas référence à l'appelant ne pose aucun problème. Le curry fonctionne-t-il ici?

Merci, Ingo

Répondre

14

La façon la plus simple d'y arriver est d'envelopper la méthode dans une fermeture, comme suit:

def printValueMethod(String s){ 
    println "The value is: '$s'" 
} 

String.metaClass.printValueMethod = { -> printValueMethod(delegate) } 

assert 'variable B'.printValueMethod() == "The value is: 'variable B'" 

La façon idiomatiques d'ajouter une méthode sans utiliser des fermetures serait créer une classe de catégorie et le mélanger comme ceci:

class PrintValueMethodCategory { 
    static def printValueMethod(String s) { 
     println "The value is: '$s'" 
    } 
} 

String.metaClass.mixin(PrintValueMethodCategory) 

assert 'variable B'.printValueMethod() == "The value is: 'variable B'" 

Je ne pense pas taitement peut aider dans ce cas particulier, puisque vous ne connaissez pas la valeur o f le délégué au moment de l'affectation à la métaclasse.

+0

Nice. Merci. Je n'ai jamais pensé à cela ... Y a-t-il aussi un moyen pratique d'ajouter beaucoup de méthode d'aide statique à une classe (pas par catégorie). Par exemple Apache Commons IO FileUtils à la classe de fichier? – Ingo

+0

ah ... votre édition répond également à ma question supplémentaire. Merci encore. – Ingo