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=元記事]の方でもリンクさせていただいてます。