30分でわかる(かも知れない)Groovy超入門! (5/5)
作成:2013-09-28 10:57
更新:2013-09-28 10:57
更新:2013-09-28 10:57
■関数とクロージャー
これだけJavaとそっくりだと「じゃあJavaでいいじゃん」と思ってしまいそうですが、もちろん違うてんもあります。ルーズステートメントのような安直な書き方ができるということもありますが、もう1つ、非常に重要な点があります。それは「関数」です。
Groovyでは、「クラスに属さないメソッド」を書くことができます(←関数のこと)。これは通常のメソッドと同様、defで定義されます。
このようにすると、その変数に関数の処理が代入されます。そして、「変数()」というように()をつけて呼び出せば、その変数内にある関数が実行され結果が返されるようになります。やってみましょう。
では、この「関数を持つ変数」を更に一歩進めて「関数を返す関数を持つ変数」を作ってみましょう。ちょっとややこしくなりますが……。
――が、よく考えてみてください。変数tax5やtax10に代入されているのは、returnで返される関数だけです。ってことは、変数taxは含まれていないのです。それなのに、ちゃんと計算はできています。
なぜか? それはreturnで返された関数では、関数だけでなく、その関数が実行されるための「環境」も保持されているからです。その関数を実行するのに必要な値などがその関数外にあってもそれらを環境として保持し続けているのです。
このような「関数環境をまるごと変数として持ち歩ける機能」を「クロージャー」と呼んでいます。これはJava 8でサポートするといわれていますから、いずれはJavaでも同様の機能が使えるようになるでしょう。今のうちに、Groovyで「クロージャーってどんなものか」を体験しておくのもいいんじゃないでしょうか。
――というわけで、超かいつまんで「Groovyがどんな言語か?」をまとめてみました。Javaを既に使っているなら、この程度のポイントをしっかり抑えておけば、ごく簡単なGroovyスクリプトはすぐにでも書けるようになります。そして、Grailsを利用する上で必要なGroovyの知識は、この程度で十分なのです。
Groovyを使う上で迷ったら、「とりあえずJavaのつもりで書いて、文法エラーになったらそこだけ調べる」という形で進めるのが良いでしょう。それでたいていはうまくいきます。Groovyは、あくまで「Javaを使いやすくしたもの」なのですから。
Groovyでは、「クラスに属さないメソッド」を書くことができます(←関数のこと)。これは通常のメソッドと同様、defで定義されます。
def 関数名 ( 引数 ){Groovyの関数の面白いところは、このようにdefで定義するだけでなく、リテラルとして関数を記述できるという点です。こんな具合です。
……処理……
}
変数 = { ……処理…… }
このようにすると、その変数に関数の処理が代入されます。そして、「変数()」というように()をつけて呼び出せば、その変数内にある関数が実行され結果が返されるようになります。やってみましょう。
def func = {変数funcを呼び出すと、消費税計算した金額が出力されます。引数として渡した値は「it」という特別な変数で取り出すことができます。このように関数を変数に代入できることで、例えば関数を引数としてわたしたり返値で返したりするメソッドも作ることができます。
def tax = 0.05
println("price: ${it * (tax + 1.0)}yen.")
}
func(12300)
■環境そのものを持つ関数
では、この「関数を持つ変数」を更に一歩進めて「関数を返す関数を持つ変数」を作ってみましょう。ちょっとややこしくなりますが……。
def func = {ここでは変数funcに代入する関数の中で、更にreturn {……}というようにして関数を返すようにしています。そして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)
price: 12915.00yen.こんな具合に結果が出力されることがわかります。どちらもちゃんと計算結果が表示されますね。
price: 13530.0yen.
――が、よく考えてみてください。変数tax5やtax10に代入されているのは、returnで返される関数だけです。ってことは、変数taxは含まれていないのです。それなのに、ちゃんと計算はできています。
なぜか? それはreturnで返された関数では、関数だけでなく、その関数が実行されるための「環境」も保持されているからです。その関数を実行するのに必要な値などがその関数外にあってもそれらを環境として保持し続けているのです。
このような「関数環境をまるごと変数として持ち歩ける機能」を「クロージャー」と呼んでいます。これはJava 8でサポートするといわれていますから、いずれはJavaでも同様の機能が使えるようになるでしょう。今のうちに、Groovyで「クロージャーってどんなものか」を体験しておくのもいいんじゃないでしょうか。
――というわけで、超かいつまんで「Groovyがどんな言語か?」をまとめてみました。Javaを既に使っているなら、この程度のポイントをしっかり抑えておけば、ごく簡単なGroovyスクリプトはすぐにでも書けるようになります。そして、Grailsを利用する上で必要なGroovyの知識は、この程度で十分なのです。
Groovyを使う上で迷ったら、「とりあえずJavaのつもりで書いて、文法エラーになったらそこだけ調べる」という形で進めるのが良いでしょう。それでたいていはうまくいきます。Groovyは、あくまで「Javaを使いやすくしたもの」なのですから。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
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)
※関連コンテンツ