うさぎ組

ソフトウェア開発、チームによる製品開発、アジャイル、ソフトウェアテスト

BL的にGroovyのmetaClassを使うとこうなる。

Groovyはメソッドを実行時に拡張できます。
追加したり、オーバーライドしたり、オーバーロードしたり。
ということで、Stringクラスに*演算子メソッドを追加しちゃいましょう。
そう、かけ算ですね!

String.metaClass.multiply = {String a_uke ->
  return delegate+"「ほら、もっと力抜かないと。」" + a_uke + "「ありがとうございますっ。。。"+delegate+"さん///」" 
}
String 先輩 = "一輝"
String 後輩 = "祐也"
println "${先輩} * ${後輩}"
println 先輩 * 後輩

これを実行すると

一輝 * 祐也
一輝「ほら、もっと力抜かないと。」祐也「ありがとうございますっ。。。一輝さん///」

と表示されます。

実行結果:http://ideone.com/eiaZE

Groovyでは各演算子に対応したメソッドが提供されていて、*演算子はmultiplyメソッドに対応づけられています。
具体的に少しあげると

plus():+
minus():-
multiply():*
div():/

などです。

Groovyが提供しているStringクラスにはmultiplyメソッドが実装されているのですが、multiply(Number num)で引数がStringのものはありません。
そこでStringを引数として実行されるmultiplyメソッドオーバーロードしています。

return 文の中にあるdelegateというのはクロージャの中で使われるthisみたいなものです。
厳密には違うのですが始めのうちは「クロージャ内ではthisじゃなくってdelegateを使う」って覚えておけばいいと思います。




※MetaClassを少し調べてみたんですが、なかなか体系的にまとめるのって難しいですね。
ということで、こういうことが出来るよ!っていうのをとりあえず書いていってからあとでまとめようかなって思いました。
もしくはまとめは何かのセッションで発表できたらいいなーって思います。