gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 08:40:59 25 4
gpt4 key购买 nike

我有一个关于 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 上的异常(exception)情况是预期的,因为该变量具有局部作用域。但我希望 b可在内部访问 method() - 不是。 @Field在 groovy 1.8.6 中没有做任何事情,尽管升级后它可以工作,所以我想这是一个旧错误。尽管如此, c在内部无法访问 method()无论是哪个版本。

所以我的问题是:
  • 为什么我不能访问用 @Field 注释的变量里面method() ?
  • 如何引用 method() 中的脚本变量?
  • 最佳答案

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

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

  • 例子:
    #!/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();

    关于Groovy 范围 - 如何在方法中访问脚本变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15619216/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com