«1. Введение
В этом руководстве мы поговорим о том, как работать с различными областями Groovy, и посмотрим, как мы можем использовать преимущества области переменных
2. Зависимости
Всюду мы будем использовать зависимости groovy-all и spock-core
dependencies {
compile 'org.codehaus.groovy:groovy-all:2.4.13'
testCompile 'org.spockframework:spock-core:1.1-groovy-2.4'
}
3. Все области видимости
Области видимости в Groovy прежде всего следуют правилу, согласно которому все переменные по умолчанию создаются общедоступными. Это означает, что, если не указано иное, мы сможем получить доступ к любой созданной нами переменной из любой другой области в коде.
Мы увидим, что означают эти области видимости, и для проверки запустим скрипты Groovy. Для запуска скрипта нам достаточно запустить:
groovy <scriptname>.groovy
3.1. Глобальные переменные
Самый простой способ создать глобальную переменную в скрипте Groovy — это назначить ее в любом месте скрипта без каких-либо специальных ключевых слов. Нам даже не нужно определять тип:
x = 200
Затем, если мы запустим следующий groovy-скрипт:
x = 200
logger = Logger.getLogger("Scopes.groovy")
logger.info("- Global variable")
logger.info(x.toString())
, мы увидим, что можем получить доступ к нашей переменной из глобальной области видимости.
3.2. Доступ к глобальным переменным из области видимости функции
Другой способ доступа к глобальной переменной — использование области видимости функции:
def getGlobalResult() {
return 1 + x
}
Эта функция определена в сценарии области видимости. Мы добавляем 1 к нашей глобальной переменной x.
Если мы запустим следующий скрипт:
x = 200
logger = Logger.getLogger("Scopes.groovy")
def getGlobalResult() {
logger.info(x.toString())
return 1 + x
}
logger.info("- Access global variable from inside function")
logger.info(getGlobalResult().toString())
В результате мы получим 201. Это доказывает, что мы можем получить доступ к нашей глобальной переменной из локальной области видимости функции.
3.3. Создание глобальных переменных из области действия функции
Мы также можем создавать глобальные переменные внутри области действия функции. В этой локальной области, если мы не используем ключевое слово при создании переменной, мы создадим ее в глобальной области. Давайте тогда создадим глобальную переменную z в новой функции:
def defineGlobalVariable() {
z = 234
}
и попробуем получить к ней доступ, запустив следующий скрипт:
logger = Logger.getLogger("Scopes.groovy")
def defineGlobalVariable() {
z = 234
logger = Logger.getLogger("Scopes.groovy")
logger.info(z.toString())
}
logger.info("- function called to create variable")
defineGlobalVariable()
logger.info("- Variable created inside a function")
logger.info(z.toString())
Мы увидим, что мы можем получить доступ к z из глобальной области видимости. Итак, это, наконец, доказывает, что наша переменная была создана в глобальной области видимости.
3.4. Неглобальные переменные
В случае с неглобальными переменными мы кратко рассмотрим переменные, созданные только для локальной области видимости.
В частности, мы рассмотрим определение ключевого слова. Таким образом, мы определяем эту переменную как часть области, в которой выполняется поток.
Итак, давайте попробуем определить глобальную переменную y и локальную переменную функции:
logger = Logger.getLogger("ScopesFail.groovy")
y = 2
def fLocal() {
def q = 333
println(q)
q
}
fLocal()
logger.info("- Local variable doesn't exist outside")
logger.info(q.toString())
Если мы запустим этот скрипт, он завершится ошибкой. Причина сбоя в том, что q — локальная переменная, принадлежащая области видимости функции fLocal. Поскольку мы создаем q с ключевым словом def, мы не сможем получить к нему доступ через глобальную область видимости.
Очевидно, мы можем получить доступ к q с помощью функции fLocal:
logger = Logger.getLogger("ScopesFail.groovy")
y = 2
def fLocal() {
def q = 333
println(q)
q
}
fLocal()
logger.info("- Value of the created variable")
logger.info(fLocal())
Итак, теперь мы видим, что хотя мы и создали одну переменную q, эта переменная больше недоступна в других областях видимости. Если мы снова вызовем fLocal, мы просто создадим новую переменную.
4. Заключение
В этой статье мы увидели, как создаются области Groovy и как к ним можно получить доступ из разных областей кода.
Как всегда, полный исходный код примеров доступен на GitHub.