libro
www.tuyano.com
初心者のためのGroovy/Grails入門

30分でわかる(かも知れない)Groovy超入門! (5/5)

作成:2013-09-28 10:57
更新:2013-09-28 10:57

■関数とクロージャー

これだけJavaとそっくりだと「じゃあJavaでいいじゃん」と思ってしまいそうですが、もちろん違うてんもあります。ルーズステートメントのような安直な書き方ができるということもありますが、もう1つ、非常に重要な点があります。それは「関数」です。

Groovyでは、「クラスに属さないメソッド」を書くことができます(←関数のこと)。これは通常のメソッドと同様、defで定義されます。
def 関数名 ( 引数 ){
    ……処理……
}
 Groovyの関数の面白いところは、このようにdefで定義するだけでなく、リテラルとして関数を記述できるという点です。こんな具合です。
変数 = { ……処理…… }

このようにすると、その変数に関数の処理が代入されます。そして、「変数()」というように()をつけて呼び出せば、その変数内にある関数が実行され結果が返されるようになります。やってみましょう。
def func = {
   def tax = 0.05
   println("price: ${it * (tax + 1.0)}yen.")
}

func(12300)
変数funcを呼び出すと、消費税計算した金額が出力されます。引数として渡した値は「it」という特別な変数で取り出すことができます。このように関数を変数に代入できることで、例えば関数を引数としてわたしたり返値で返したりするメソッドも作ることができます。


■環境そのものを持つ関数

では、この「関数を持つ変数」を更に一歩進めて「関数を返す関数を持つ変数」を作ってみましょう。ちょっとややこしくなりますが……。
def func = {
   def tax = it
   return {
     println("price: ${it * (tax + 1.0)}yen.")
   }
}

def tax5 = func(0.05)
tax5(12300)
def tax10 = func(0.1)
tax10(12300)
ここでは変数funcに代入する関数の中で、更にreturn {……}というようにして関数を返すようにしています。そしてfuncの返値をそれぞれ変数に保管して利用します。実行すると、
price: 12915.00yen.
price: 13530.0yen.
こんな具合に結果が出力されることがわかります。どちらもちゃんと計算結果が表示されますね。

――が、よく考えてみてください。変数tax5tax10に代入されているのは、returnで返される関数だけです。ってことは、変数taxは含まれていないのです。それなのに、ちゃんと計算はできています。

なぜか? それはreturnで返された関数では、関数だけでなく、その関数が実行されるための「環境」も保持されているからです。その関数を実行するのに必要な値などがその関数外にあってもそれらを環境として保持し続けているのです。

このような「関数環境をまるごと変数として持ち歩ける機能」を「クロージャー」と呼んでいます。これはJava 8でサポートするといわれていますから、いずれはJavaでも同様の機能が使えるようになるでしょう。今のうちに、Groovyで「クロージャーってどんなものか」を体験しておくのもいいんじゃないでしょうか。


――というわけで、超かいつまんで「Groovyがどんな言語か?」をまとめてみました。Javaを既に使っているなら、この程度のポイントをしっかり抑えておけば、ごく簡単なGroovyスクリプトはすぐにでも書けるようになります。そして、Grailsを利用する上で必要なGroovyの知識は、この程度で十分なのです。

Groovyを使う上で迷ったら、「とりあえずJavaのつもりで書いて、文法エラーになったらそこだけ調べる」という形で進めるのが良いでしょう。それでたいていはうまくいきます。Groovyは、あくまで「Javaを使いやすくしたもの」なのですから。

※プログラムリストが表示されない場合

AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。

●プログラム・リスト●

関数の利用例

def func = {
   def tax = 0.05
   println("price: ${it * (tax + 1.0)}yen.") 
}

func(12300)


※クロージャーの利用例

def func = {
   def tax = it
   return {
     println("price: ${it * (tax + 1.0)}yen.")
   }
}

def tax5 = func(0.05)
tax5(12300)
def tax10 = func(0.1)
tax10(12300)

※関連コンテンツ

「初心者のためのGroovy/Grails入門」に戻る