No Programming, No Life

プログラミング関連の話題や雑記

Groovyソースコード斜め読み(その2)「私をもっと評価して! 」

このシリーズの一覧はこちら

はじめに

GroovyにゃGroovyShellっていう便利なクラスがおってのぅ、こいつにevaluatしておくれとお願いすれば、なんとまぁ普通の文字列をGroovyコードとして評価してくれるんじゃ。良い時代になったもんじゃのぅ。

と、誰得かわからない語り口調で始めてみましたが、今回は上記のGroovyShellの簡易版のEval (Groovy 1.8.6)Evalというクラスの話。これを利用することでもっと簡単にGroovyコードを評価してあげることができるようになるわけです。
(動作確認: Groovy Version: 1.8.0-rc-3 JVM: 1.6.0_24)

とってもシンプル

クラス階層
java.lang.Object
    groovy.util.Eval

親はオブジェクトのみ。groovy.utilパッケージはimport済みなのでimport宣言も要らない。

メソッド
  • 5つしかない
  • 全部static

まずは「私」

ある日、何の気なしに街をブラついていた「私」は突如として事件に巻き込まれることとなった。

Eval.me('ここにGroovyコード')

このように書いてあげるだけで「私(ぐるーびーコード)」を評価してあげられるのです。評価結果はコードの最後に評価された値が戻り値として返ってきます。

容疑者X

まず捜査線上に浮かび上がって来た一番あやしい人物はXだった。

Eval.x(ここにxの値, 'ここにxという変数を含んだGroovyコード')

xという極めてシンプルな名前のメソッドを利用すると、Groovyコードに変数xとして値を渡すことができます。戻り値はmeと同じく文字列で渡したGroovyコードの最後に評価された値です。

容疑者Y

ところが同時刻にアリバイのないYという人物もいることがわかってきた。

Eval.xy(ここにxの値, ここにyの値, 'ここにxとyという変数を含んだGroovyコード')

xだけでは物足りない人にお勧めなのがこのxyという名前のメソッド。xyなんて座標?と勘違いされそうな名前ですが違うんです。xyではなんとGroovyコードに変数xと変数yを渡すことができます。戻り値はmeと同じく文字列で渡したGroovyコードの最後に評価された値です。

真犯人Z

事件は急展開をむかえる!突如として自分は真犯人だというZが現れたのだ。

Eval.xyz(ここにxの値, ここにyの値, ここにzの値, 'ここにxとyとzという変数を含んだGroovyコード')

XYZ がアルファベットの最後であることから、「これ以上良いものは無い究極のカクテル」とか「これ以上のものは作れない究極のカクテル」という意味合いが込められている (中略) 他にも、同様の理由で、「もう後が無い」「最後の」といった意味が込められているとする説もある。

X-Y-Z - Wikipedia

xyz最強伝説。ウソです。Groovyコードに変数x, 変数y, 変数zを埋め込めます。戻り値はmeと同じく文字列で渡したGroovyコードの最後に評価された値です。

再び私

なんとZは「私」の恋人だった、「私」は彼が犯人ではないことは知っていた。そしておもむろに真犯人の名を捜査員に告げる…

Eval.me(ここに変数名, ここに変数の値, 'ここに変数名を含んだGroovyコード')

xyzが最強なので、xyzωとか、xyzγβεみたいなものは存在しないわけです。しかし、世の中x、y、zじゃなくて他の文字が使いたい!どうしてもhogeが使いたい!って人もいるでしょう、そんな人のために「私」は再び立ち上がります。
「変数名、値、コード」の順番で「私」を呼び出せばGroovyコードは指定した変数名を理解することができるようになります。戻り値はこれまで同様Groovyコードの最後に評価された値です。

使用例 (サンプルコード)

半分以上ふざけた文章ですみませんでした(笑)ここまで読んでいただきありがとうございます。
最後に簡単な使用例を載せておきます。

まとめ

事件も無事解決したし、究極のカクテルを傾けながらもっとぐるーびーたんを評価してあげましょう。
Eval me! (もっと私を評価してねっ♪)

*1:[http://d.hatena.ne.jp/fumokmm/20101019/1287493540:title=元記事]の方でもリンクさせていただいてます。