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

标签 groovy metaprogramming metaclass

在 Groovy 中,我可以通过猴子修补元类的 call 方法使对象像函数一样可调用:

myObject.metaClass.call = { "hello world" }
println myObject() // prints "hello world"

修补 call 只允许我调用不带参数的对象。有没有一种方法允许使用标准的类似函数的语法通过参数调用对象?


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

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

(如您所见,args 是一个对象数组)

或者对于一个参数:

myObject.metaClass.call = { who -> "hello $who" }

或者,如果您希望将单个参数作为可选参数,您可以这样做:

myObject.metaClass.call = { who = null -> "hello ${who ?: 'world'}" }

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

关于groovy - Groovy 对象可以像带参数的函数一样被调用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13477037/

相关文章:

java - Groovy:无法将类 'null' 的对象 'null' 转换为类 'double' 。尝试改为 'java.lang.Double'

grails - HTTPBuilder库

metaprogramming - 自动移植工具和可以编译成其他语言的语言

grails - 使用元类删除/修改域属性

groovy - 使用 groovy 类别添加动态属性

python - 有人可以解释一下这里提到的策略元类的目的吗

grails - Groovy MetaClass-将类别方法添加到适当的metaClasses

Jenkins 全局管道库目录结构

c++ - 计算斐波那契数的模板元编程

python - 定义元类时是否有任何理由选择 __new__ 而不是 __init__ ?