metaClass.defineが凄い!

今日のGCRはustream参戦。途中で途切れてしまったり、音が聴こえなくなったりしてしまったもののパワポを見ながら眺めていたら結構勉強になりました。
中でも興味を引かれたのがdefine。

String.metaClass.define {
    foo { s-> println s + delegate }
    bar { println “hello” }
}
“world”.foo(“hai”) // haiworldが出力
“abc”.bar() // helloが出力

みたいに動的メソッドをまとめて定義出来る1.6の新機能なんですが、どうも見る限りクロージャを受けてBuilder風の事をしているだけのような…だとすると別定義出来るかも!?と試してみました。

def defs = {
   x2{println delegate*2}
   x3{println delegate*3}
}

def aaa = "Test"
aaa.metaClass.define(defs)
aaa.x2()
aaa.x3()

def one = 1
one.metaClass.define(defs)
one.x2()
one.x3()

すると、見事!

TestTest
TestTestTest
2
3

の様な結果が。これは便利です!ほかにも@MixinやAST変換自体などの動的な機構の追加もうれしいですねー。1.6最高!
上でも使っているJavaクラスのインスタンスへの動的メソッド追加も地味にうれしいです。今までだとインスタンスに直でメソッドを追加出来るのはgroovyで定義したクラスだけだったんですね。
良くわからないまま出来たり出来なかったりして、ちょっと手間取ったりしたような…これからは必ず出来るので安心です^^