2009-07-28 9 views

答えて

5

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() 
+2

私はそれもメタクラスを変更することなく動作します気づきました。 'call'という名前のメソッドを追加すると、呼び出されます。 – Geo

+0

すばらしい答え!しかし、ExapandoMetaClassリンクは壊れています。 – jacwah

関連する問題