«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.