Re: groovyクロージャについて徒然と
http://d.hatena.ne.jp/uehaj/20091015/1255573409
groovyのクロージャをブロックとして使っていると、breakとかcontinueとかができませんのできっと誰もが最初はあれ?と思ったはず。
groovyクロージャについて徒然と - uehaj's blog
理由は単純で、クロージャというのは無名メソッド定義であって、たまたま平たくコード中にならんでいて、スコープ則にしたがって変数参照ができますが、実体は別メソッドなんですね。
そう,Groovyのクロージャはブロックではない。なのでデバッガで追跡するときは,ちょっとしたコツ(というかクセ)が要るのです。たとえば,こんなしょうもないコードがあったとして,
(1..4).each { println it } println "done"
最初の行にブレークポイントを仕込んだとしよう。デバッガ動かして,最初の行で止めたとしてStep Overすると,クロージャには入らず最後の行に移動してしまう(だってブロックじゃなくてメソッドだもん)。なので,この場合はStep Intoが正解。
最近のIntelliJ(たぶんIDEA8あたり)だと,クロージャの中にブレークポイント仕込んでも,それっぽくトレース出来るようになったけど,昔はクロージャ内にブレークポイント仕込めなかったんだよね。:-(
デバッガで起動すると,こんな感じでブレークポイントにたどり着く(左側のスタック情報(frames)に注目!)。