У меня вопрос о правилах определения области видимости в Groovy. В следующем фрагменте у меня есть три переменные, a
имеет локальную область видимости, b
имеет область script, а c
также должна обладать областью script, используя аннотацию @Field
.
#!/usr/bin/groovy
import groovy.transform.Field;
//println org.codehaus.groovy.runtime.InvokerHelper.getVersion()
def a = 42;
b = "Tea"
@Field def c = "Cheese"
void func()
{
// println a // MissingPropertyException
println b // prints "Tea"
println c // prints "Cheese" with groovy 2.1.2, MissingPropertyException with groovy 1.8.6
}
class Main
{
def method()
{
// println a // MissingPropertyException
// println b // MissingPropertyException
// println c // MissingPropertyException with both 1.8.6. and 2.1.2
}
}
func();
new Main().method();
Я получаю MissingPropertyException
в строках, обозначенных комментариями. Исключения из a
ожидаются, так как эта переменная имеет локальную область видимости. Но я ожидал бы, что b
будет доступен внутри method()
- это не так.
@Field
ничего не делает в groovy 1.8.6, хотя после обновления он работает, поэтому я думаю, что это старая ошибка. Тем не менее, c
недоступен внутри method()
с любой версией.
Итак, мои вопросы:
- Почему я не могу получить доступ к переменной, аннотированной с помощью
@Field
внутриmethod()
? - Как я могу ссылаться на переменную script внутри
method()
?