Ответ 1
Groovy действительно не имеет глобальной области. Когда у вас есть groovy script, который не объявляет класс, он неявно застревает в классе с именем script. Таким образом, конечные переменные в области верхнего уровня - это действительно просто поля неявного класса. Например:
// foo.groovy
final MYCONSTANT = "foobar"
println MYCONSTANT
class Helper {
def hello() { println MYCONSTANT } // won't work
}
new Helper().hello()
Более или менее эквивалентно:
class foo {
def run() {
final MYCONSTANT = "foobar"
println MYCONSTANT
new Helper().hello()
}
static main(args) {
new foo().run()
}
}
class Helper {
def hello() { println MYCONSTANT } // won't work
}
Легко понять, почему он не работает. Легкая работа заключается в том, чтобы объявить ваши "глобалы" в фиктивном классе, например, например. Константы, а затем просто сделайте статический импорт на нем. Он даже работает в одном script. Пример:
import static Constants.*
class Constants {
static final MYCONSTANT = "foobar"
}
println MYCONSTANT
class Helper {
def hello() { println MYCONSTANT } // works!
}
new Helper().hello()
ИЗМЕНИТЬ:
Кроме того, скрипты представляют собой бит особого случая. Если вы объявляете переменную без def
или любых модификаторов, таких как final
, (то есть просто используйте ее), она переходит в привязку script. Итак, в этом случае:
CONSTANT = "foobar"
println "foobar"
CONSTANT находится в script -общем привязке, но в:
final CONSTANT = "foobar"
println "foobar"
CONSTANT - это локальная переменная в методе script run()
. Более подробную информацию об этом можно найти на https://web-beta.archive.org/web/20150108090004/http://groovy.codehaus.org/Scoping+and+the+Semantics+of+%22def%22