3

callGroovy では、メタクラスのメソッドにモンキー パッチを適用することで、オブジェクトを関数のように呼び出し可能にすることができます。

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

パッチを適用callすると、引数なしでオブジェクトを呼び出すことしかできなくなります。標準の関数のような構文を使用して、引数を指定してオブジェクトを呼び出す方法はありますか?


編集: 1つの答えはtim_yatesが示唆するとおりですが、call明示的なメタプログラミングなしで単純にオーバーライドできるというataylorのコメントから注目に値します:

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

def myObject = new MyType()
println myObject("foo", "bar") // prints 'args were ["foo", "bar"]'

どうやらトリックは、を使用した可変引数署名...argsです。

4

1 に答える 1

7

あなたがすることができます:

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

(ご覧のとおり、args はオブジェクトの配列です)

または、1 つのパラメーターの場合:

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

または、その単一のパラメーターをオプションのパラメーターとして使用する場合は、次のようにします。

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

assert myObject( 'tim' ) == 'hello tim'
assert myObject() == 'hello world'
于 2012-11-20T16:01:41.500 に答える