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()-そうではありません。
@Fieldgroovy 1.8.6では何もしませんが、アップグレードした後は機能するので、これは古いバグだと思います。それにもかかわらず、どちらのバージョンでもc内部にはアクセスできません。method()
だから私の質問は:
@Field内部 で注釈が付けられた変数にアクセスできないのはなぜmethod()ですか?- 内部のスクリプト変数を参照するにはどうすればよい
method()ですか?