有没有办法在Groovy中拥有可调用对象?

Geo*_*Geo 4 groovy language-features object callable

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


def myObject = new A()
myObject()
Run Code Online (Sandbox Code Playgroud)

那会调用一些对象方法.可以吗?

Rub*_*ben 6

在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)
Run Code Online (Sandbox Code Playgroud)

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

MyObject.metaClass.call = { prinlnt 'I was called' }
def myObject = new MyObject()
myObject()
Run Code Online (Sandbox Code Playgroud)

如果您只想使特定实例可调用,则可以动态地向其元类添加调用方法:

def myObject = new MyObject()
myObject.metaClass.call = { println 'Called up on' }
myObject()
Run Code Online (Sandbox Code Playgroud)

  • 我注意到它甚至在不改变元类的情况下也能正常工作.如果我添加一个名为`call`的方法,它将被调用. (2认同)