2010-12-10 11 views
9

私はGroovyでメタクラスプログラミングをしています。しかし、突然、私はちょうど働いて得ることができなかった小さな問題に直面していた...ここでメタクラスにメソッドを追加する

は簡単なスクリプトです:

// define simple closure 
def printValueClosure = { 
println "The value is: '$delegate'" 
} 

String.metaClass.printValueClosure = printValueClosure 

// works fine 
'variable A'.printValueClosure() 



// define as method 
def printValueMethod(String s){ 
println "The value is: '$s'" 
} 

// how to do this!? 
String.metaClass.printValueMethod = this.&printValueMethod(delegate) 

'variable B'.printValueMethod() 

は、それがメソッドを使用しますが、呼び出しに最初のパラメータを設定することが可能ですオブジェクト?デリゲートを使用して動作していないようです...呼び出し元を参照していないメソッドの割り当ては問題ありません。カリングはここで動作しますか?

def printValueMethod(String s){ 
    println "The value is: '$s'" 
} 

String.metaClass.printValueMethod = { -> printValueMethod(delegate) } 

assert 'variable B'.printValueMethod() == "The value is: 'variable B'" 

idomatic道をすることであろうクロージャを使用せずにメソッドを追加する:

おかげで、 インゴ

答えて

14

これを実現する最も簡単な方法はそうのように、閉鎖中の方法をラップすることです

class PrintValueMethodCategory { 
    static def printValueMethod(String s) { 
     println "The value is: '$s'" 
    } 
} 

String.metaClass.mixin(PrintValueMethodCategory) 

assert 'variable B'.printValueMethod() == "The value is: 'variable B'" 

私はこの特定のケースでは役に立たないと思っています。なぜなら、あなたは値oを知らないからですfメタクラスへの割り当て時の代理人。

+0

ニース。ありがとう。決してそれを考えませんでした...クラスに(クラスではなく)たくさんの静的ヘルパーメソッドを追加する便利な方法がありますか?たとえば、Apache Commons IO FileUtilsをファイルクラスに設定しますか? – Ingo

+0

ああ...あなたの編集も私の追加質問に答えます。再度、感謝します。 – Ingo

関連する問題