Groovy对象可以像带参数的函数一样调用吗?

Groovy对象可以像带参数的函数一样调用吗?,groovy,metaprogramming,metaclass,Groovy,Metaprogramming,Metaclass,在Groovy中,我可以通过对元类“callmethod: myObject.metaClass.call = { "hello world" } println myObject() // prints "hello world" 修补call只允许我调用没有参数的对象。有没有一种方法允许使用标准的函数式语法通过参数调用对象 编辑:一个答案与tim_yates的建议完全一致,尽管从ataylor的评论中值得注意的是,您可以简单地覆盖调用,而无需显式元编程: class MyType {

在Groovy中,我可以通过对元类“
call
method:

myObject.metaClass.call = { "hello world" }
println myObject() // prints "hello world"
修补
call
只允许我调用没有参数的对象。有没有一种方法允许使用标准的函数式语法通过参数调用对象


编辑:一个答案与tim_yates的建议完全一致,尽管从ataylor的评论中值得注意的是,您可以简单地覆盖
调用
,而无需显式元编程:

class MyType {
    def call(...args) {
        "args were: $args"
    }
}

def myObject = new MyType()
println myObject("foo", "bar") // prints 'args were ["foo", "bar"]'
显然,诀窍在于使用
…args

变量签名,您可以执行以下操作:

myObject.metaClass.call = { ...args -> "hello $args" }
assert myObject( 'one', 'two', 'three' ) == 'hello [one, two, three]'
myObject.metaClass.call = { who = null -> "hello ${who ?: 'world'}" }

assert myObject( 'tim' ) == 'hello tim'
assert myObject() == 'hello world'
(如您所见,args是一个对象数组)

或对于一个参数:

myObject.metaClass.call = { who -> "hello $who" }
或者,如果希望将该单个参数作为可选参数,可以执行以下操作:

myObject.metaClass.call = { ...args -> "hello $args" }
assert myObject( 'one', 'two', 'three' ) == 'hello [one, two, three]'
myObject.metaClass.call = { who = null -> "hello ${who ?: 'world'}" }

assert myObject( 'tim' ) == 'hello tim'
assert myObject() == 'hello world'

隐马尔可夫模型。。。我可以发誓我尝试了这个方法,但没有成功,但再次尝试似乎证明了这一点。虽然问题具体是通过元类添加行为,但值得注意的是,这也适用于名为
call
的标准方法,不需要元编程。