2009-09-08 22 views
6

Groovyオペレータ.&を理解すると、メソッド呼び出しをクロージャに変換することになります。 (Groovy consoleで実行することができます)、次のコードは動作するはずのようなので、それはそうです:もちろんメソッドをクロージャとして呼び出す

class Foo { 
    def method(def param) { 
    param + 10 
    } 
} 

def invokeClosure = {Closure closure -> 
    return closure.call() 
} 

def f = new Foo() 
invokeClosure f.&method(6) 

私は

invokeClosure {f.method(6)} 

に最後の行を変更した場合、それは正常に動作しますが、何がと間違っています.&オペレータの私の理解?

おかげで、

ドン

答えて

8

を使用して閉鎖する変換方法。 &表記法では、パラメータを省略します。 f。 &メソッド(6)はf.method(6)を呼び出すのと同じです。これは16を返します。したがって、あなたの例では16をinvokeClosureに渡し、クロージャは渡しません。どのIntegerクラスは、呼び出し方法がないので、次の例外が発生します。

スロー例外:メソッドのシグネチャなし:以下java.lang.Integer.call()

ためのメソッドポインタを渡すをf.methodをinvokeClosureに追加すると、通常どのように使用するのかが分かります。 &。

class Foo { 
    def method(def param) { 
    param + 10 
    } 
} 

def invokeClosure = {Closure closure -> 
    return closure.call(6) // can leave off .call 
} 

def f = new Foo() 
invokeClosure f.&method 

次は動作します指摘したように:

invokeClosure {f.method(6)} 

あなたはclosure.call()は、その場合には動作します理由ですので、パラメータを取らないクロージャを渡しているためです。

+1

実際には、厳密に私が考える言えば '{f.method(6)}' '一方つのパラメータをとるクロージャである{ - (6)> f.method}' NOのparamsをとらない閉鎖です。しかし、素晴らしい答えです、ありがとう! –

1

代わりにinvokeClosure f.&method.curry(6)を使用してください。これはパラメータなしで呼び出すことができるクロージャです

0

上記の例は、引数を引数としてinvokeClosureに取り込むように拡張することもできます。それはあなたに期待される結果と構文を与えるだろう。

class Foo { 
    def method(def param) { 
    param + 10 
    } 
} 

def invokeClosure = {Closure closure, def parameter -> 
    return closure.call(parameter) 
} 

def f = new Foo() 
invokeClosure f.&method, 6 
関連する問題