【问题标题】:Is there a way to have callable objects in Groovy?有没有办法在 Groovy 中拥有可调用对象?
【发布时间】:2010-11-14 18:58:57
【问题描述】:

例如,如果我有一个名为 A 的类。我可以像 Python 那样使对象可调用吗?例如:


def myObject = new A()
myObject()

这会调用一些对象方法。能做到吗?

【问题讨论】:

    标签: groovy object language-features callable


    【解决方案1】:

    在 Groovy 中,默认情况下只有闭包是可调用的。例如。类不能开箱即用。如有必要,您可以动态地将调用方法添加到类型的ExpandoMetaClass 以使该类型的所有实例可调用

    提示:您可以使用GroovyConsole 试用所有代码示例

    在 Groovy 中,闭包默认是 可调用的

    // A closure
    def doSomething = { println 'do something'}
    doSomething()
    
    // A closure with arguments
    def sum = {x, y -> x + y}
    sum(5,3)
    sum.call(5,3)
    
    // Currying
    def sum5 = sum.curry(5)
    sum5(3)
    

    要使特定类型的所有实例可调用,您可以动态地将调用方法添加到其元类:

    MyObject.metaClass.call = { prinlnt 'I was called' }
    def myObject = new MyObject()
    myObject()
    

    如果您只想让一个特定的实例可调用,您可以动态地将调用方法添加到它的元类中:

    def myObject = new MyObject()
    myObject.metaClass.call = { println 'Called up on' }
    myObject()
    

    【讨论】:

    • 我注意到即使不改变元类它也能工作。如果我添加一个名为call 的方法,它将被调用。
    • 很好的答案!但 ExapandoMetaClass 链接已损坏。
    猜你喜欢
    • 2018-07-08
    • 2016-03-07
    • 2020-10-23
    • 2010-10-27
    • 2013-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多