в заводных сценариях (в отличие от класса), код по существу эквивалентен:
class ScriptName {
def main(args) {
new ScriptName().run(args)
}
def run(args) {
def f = 'foo'
foo()
}
def foo() {
println(f)
}
}
на «неявный» вмещающем класс кра выдержанный groovy для groovy-скриптов, всегда присутствует, но не отображается в вашем коде. Вышеприведенное делает очевидным, почему метод foo
не видит переменную f
.
У вас есть несколько вариантов
вариант 1 - связывание
Смотрите groovy docs on script bindings для деталей.
// put the variable in the script binding
f = 'foo'
это сокращение для:
binding.setVariable('f', 'foo')
где скрипт связывания виден везде заводных сценарии, и это делает переменные по существу «глобальным».
вариант 2 - @Field аннотацию
См groovy docs on the Field annotation подробности.
import groovy.transform.Field
...
// use the groovy.transform.Field annotation
@Field f = 'foo'
Поле аннотаций специально там, чтобы дать Groovy скрипты возможность добавлять поля к «неявной» вмещающих класса. Сгенерированный класс будет выглядеть примерно так:
class ScriptName {
def f = 'foo'
def main(args) {
new ScriptName().run(args)
}
def run(args) {
foo()
}
def foo() {
println(f)
}
}
, который также по существу делает переменную доступной «глобально» в сценарии.