Groovy最近、業務でこそっとGroovyを使いだしているのですが、軽くクロージャ周りでハマったのでメモ。別に階乗のプログラムが書きたかったわけではないのですが、サンプルとして。}}println(factorial(args[0].toInteger()))こんなプログラムを書いて、実行します。recur_closure.run(recur_closure.groovy:35)factorialなんてメソッド、知らないよと言って死んでくれます。いうわけで、なんかクロージャーに制限がありそうなので、本家の以下のサンプルを見てみました。Way」を参考にすると、こうなります。5120おお、動きました。ポイントは、先にdefキーワードで変数だけ宣言しておくことですね。Closureクラスのインスタンスで初期化するかどうかは、どちらでもいいみたいです。これってちょっとイマイチですよねぇ。なんとかならんのかと調べたところ、GroovyのClosureにはcallというメソッドがあるらしく、これを使えばいいらしいです。}}println(factorial(args[0].toInteger()))これで、3番目のコードと同じ動作をします。ところで、Scalaの場合はどうなのかな?と思い、ちょっと試してみました。1println(factorial(args(0).toInt))では、実行。5120...動きました。これはちょっと予想外でした。defによるメソッド定義なら動くことはわかっていますが、変数定義(val)でもいけるとは。Scalaはメソッドとフィールド(特にval)の扱いがかなり近いみたいなので、同じように使えるってことかな?ただ、さすがに再帰定義なので型推論に頼りきることはできません。found再帰定義だから型が必要だよ、と怒られてしまいます。普段Scalaを使う時は、こういう風にローカル関数で書くことの方が多いですかね。気楽に関数定義できるので。n)}println(factorial(args(0).toInt))GroovyとScalaの両者のこの差は、第1級のオブジェクトとして扱っているのがClosureクラスのインスタンスなのかFunctionNクラスのインスタンスかの差なのでしょうかね。Groovyはクロージャを1級市民として扱うことに重きをおいたのかな?とはいっても、両者の考え方の差なのでこれに優劣つける気はないのですがね。事実、Groovyは使ってみるとスクリプト言語らしいパワフルさを持っていて、書いていてけっこう楽しかったですし。...ところで、完全な余談ですがClosureをアルファベットで書こうとすると、どうしてもClojureと打ち間違えてしまいます。前は、GroovyよりもClojureの方がプログラムを書いてましたからね。5はてなブログをはじめよう!Kazuhiraさんは、はてなブログを使っています。ブログを報告する引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。