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)に注目!)。