向元类添加方法

Posted

技术标签:

【中文标题】向元类添加方法【英文标题】:Add method to metaclass 【发布时间】:2011-05-23 15:31:04 【问题描述】:

我只是在玩 Groovy 中的元类编程。但是突然间我遇到了一个我无法工作的小问题......

这是简单的脚本:

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

是否可以使用方法但将第一个参数设置为调用对象?使用委托似乎不起作用......不引用调用者的方法的分配没有问题。柯里化在这里有用吗?

谢谢, 英戈

【问题讨论】:

【参考方案1】:

实现这一点的最简单方法是将方法包装在闭包中,如下所示:

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


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

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

在不使用闭包的情况下添加方法的惯用方法是创建一个类别类并将其混合如下:

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

我认为柯里化在这种特殊情况下没有帮助,因为在分配给元类时您不知道委托的值。

【讨论】:

不错。谢谢。从来没有想过......是否还有一种方便的方法可以将大量静态辅助方法添加到类(而不是通过类别)。比如 Apache Commons IO FileUtils 到文件类? 啊...您的编辑也回答了我的附加问题。再次感谢。

以上是关于向元类添加方法的主要内容,如果未能解决你的问题,请参考以下文章

为啥向元类属性闭包组合添加第二个属性会更改第一个属性?

如何在 python 中使用元类来增加或覆盖添加到类中的方法

删除单个元类方法

1104课堂小结

面向对象之 元类 , 反射 , 双下方法

16 元类