GroovyのScriptは、暗黙的に実行可能クラスとなりますが、ローカル変数はそのクラスのFieldではありません。
そのため、メソッドを定義した場合、そのメソッドからScriptのローカル変数を呼ぶことはできません。
つまり、以下のコードはエラーになります。
FieldNG.groovy
def myVar = 'myvar'
def callMyVar() {
println myVar
}
callMyVar()
クロージャのスコープは、クロージャ自身もローカルに定義されていますので以下はエラーになりません。
LocalOK.groovy
def myVar = 'myvar'
def callMyVar = {
println myVar
}
callMyVar()
フィールドとして宣言したい場合は、以下の様なAnnotationを用いてAST変換を行います。
FieldOK.groovy
import groovy.transform.*
@Field
def myVar = 'myvar'
def callMyVar(){
println myVar
}
callMyVar()
スクリプトを書くとき、クロージャではなくメソッドを定義する癖のある人はハマるかもしれませんね。