2010-12-10 9 views
9

Solo estoy jugando con la programación de metaclase en Groovy. Pero de repente que estaba frente a un pequeño problema, que yo no podía conseguir trabajo ...Agregar método a metaclass

Aquí está el script sencillo:

// 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() 

¿Es posible utilizar el método, pero puse el primer parámetro de la llamada ¿objeto? usar delegado parece no funcionar ... La asignación de métodos que no hacen referencia a la persona que llama no es un problema. ¿Funciona el currificado aquí?

Gracias, Ingo

Respuesta

14

La forma más sencilla de lograr esto es envolver el método en un cierre, así:

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

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

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

La forma idiomáticas para agregar un método sin utilizar cierres sería crear una clase de categoría y se mezcla en este modo:

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'" 

no creo currying puede ayudar en este caso particular, ya que no se conoce el valor o f el delegado en el momento de la asignación a la metaclase.

+0

Agradable. Gracias. Nunca pensé en eso ... ¿Existe también una forma conveniente de agregar mucho método estático de ayuda a una clase (no por categoría). Por ejemplo Apache Commons IO FileUtils a la clase de archivo? – Ingo

+0

ah ... tu edición también responde a mi pregunta adicional. Gracias de nuevo. – Ingo

Cuestiones relacionadas