加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Groovy范围 – 如何在方法中访问脚本变量

发布时间:2020-12-14 16:37:59 所属栏目:大数据 来源:网络整理
导读:我有一个关于Groovy中的范围规则的问题。在下面的代码片段中,我有三个变量,一个有局部作用域,b个有脚本范围,c也应该使用@Field注释来获取脚本作用域。 #!/usr/bin/groovyimport groovy.transform.Field;//println org.codehaus.groovy.runtime.InvokerHe
我有一个关于Groovy中的范围规则的问题。在下面的代码片段中,我有三个变量,一个有局部作用域,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();

我在注释线上得到MissingPropertyExceptions。由于该变量具有本地作用域,因此预期出现异常。但是我希望b可以在method()中访问 – 它不是。
@Field在groovy 1.8.6中没有做任何事情,虽然升级后它工作,所以我猜这是一个旧的bug。然而,在方法()中,c无法访问任何版本。

所以我的问题是:

>为什么我无法访问在@Field中注释的变量
方法()?
>如何在方法()中引用脚本变量?

解决方法

当您在groovy脚本中的类声明之外有方法或语句时,将创建一个隐式类。回答你的问题:

>在你的例子中,func()可以访问字段c,因为它们都是隐式类的成员。主班不是,所以不行。
>您需要将脚本变量的引用传递给method()。一种方法是传递隐式定义的绑定对象,通过它可以访问所有脚本范围变量。

例:

#!/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 scriptObject
    def binding

    def method()
    {
        // println a // MissingPropertyException
        println binding.b
        println scriptObject.c
    }
}

func();
new Main(scriptObject: this,binding: binding).method();

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读