Как использовать локальные переменные области видимости в Groovy Script Engine? - PullRequest
2 голосов
/ 04 марта 2012

Все переменные кажутся глобальными в моих скриптах groovy, которые я запускаю на движке скриптов groovy. Я создал классный класс, но когда я создаю переменные, к ним можно получить доступ откуда угодно. для примера.

class test{
  void func1{ a=4 }
  void func2{ print(a) }
}

Когда я вызываю эту функцию класса func1 из scala, затем вызываю func2, это приводит к «4». Странно то, что если я объявляю переменные типа «def a = 0» в функции, область действия переменной будет ограничена в функции.

Я загружаю свои скрипты Groovy из GroovyScriptEngine следующим образом (используя scala)

var gse = new GroovyScriptEngine(pathList.toArray)  
var scriptClass = gse.loadScriptByName(file.getName())
var i = scriptClass.newInstance().asInstanceOf[GroovyObject] 

затем используя invokeMethod для вызова функций в классе сценария groove. В любом случае можно ли по умолчанию ограничивать переменные области действия в функциях?

1 Ответ

3 голосов
/ 04 марта 2012

Это ожидаемое поведение, описанное в Области применения и семантике "def" .

Использование необъявленной переменной в скрипте Groovy создает переменную привязки.Переменные привязки являются глобальными для вашего скрипта.Если вы объявите свою переменную с помощью def, она станет локальной функцией.

Это поведение применимо только потому, что вы загружаете свой код как скрипт.Я не верю, что это возможно изменить.Просто используйте объявление (def или тип), когда вам нужна локальная переменная.

Обратите внимание, что вы также можете определить переменную привязки (глобальную), используя аннотацию @Field:

class test {
  void func1{ @Field int a=4 }
  void func2{ print(a) }
}

эквивалентно

class test {
  void func1{ a=4 }
  void func2{ print(a) }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...