Groovyのスコープルールについて質問があります。次のスニペットでは、3つの変数が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
内部 で注釈が付けられた変数にアクセスできないのはなぜmethod()
ですか?- 内部のスクリプト変数を参照するにはどうすればよい
method()
ですか?