我对 Groovy 中的范围规则有疑问。在下面的代码片段中,我有三个变量,a
具有本地范围,b
具有脚本范围,并且c
应该使用@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
在注释指示的行上得到 s。预计会出现异常a
,因为该变量具有本地范围。但我希望b
内部可以访问method()
- 它不是。
@Field
在 groovy 1.8.6 中没有做任何事情,尽管升级后它可以工作,所以我猜这是一个老错误。然而,无论哪个版本c
都无法访问内部method()
。
所以我的问题是:
- 为什么我不能访问用
@Field
inside 注释的变量method()
? - 如何引用里面的脚本变量
method()
?