4
たとえば、私はクラスAを持っています。Pythonのようにオブジェクトを呼び出し可能にすることはできますか?たとえば、Groovyに呼び出し可能オブジェクトを持たせる方法はありますか?
def myObject = new A()
myObject()
などです。オブジェクトメソッドが呼び出されます。それはできますか?
たとえば、私はクラスAを持っています。Pythonのようにオブジェクトを呼び出し可能にすることはできますか?たとえば、Groovyに呼び出し可能オブジェクトを持たせる方法はありますか?
def myObject = new A()
myObject()
などです。オブジェクトメソッドが呼び出されます。それはできますか?
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'という名前のメソッドを追加すると、呼び出されます。 – Geo
すばらしい答え!しかし、ExapandoMetaClassリンクは壊れています。 – jacwah