当前位置: 首页 > 知识库问答 >
问题:

Groovy scope-如何访问方法中脚本变量

云瑞
2023-03-14

我有一个关于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();

我在用注释指示的行上得到MissingPropertyExceptions。a上的异常是预期的,因为该变量具有局部作用域。但我希望b可以在method()中访问--事实并非如此。@field在Groovy1.8.6中没有执行任何操作,尽管升级后它可以工作,所以我想这是一个老错误。但是,在方法()中,无论使用哪一个版本,C都是不可访问的。

  1. 为什么不能访问method()中用@field注释的变量?
  2. 如何引用方法()中的脚本变量?

共有1个答案

姚高韵
2023-03-14

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

>

  • 在您的示例中,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 脚本访问一个环境变量。我没有使用詹金斯。如何获取变量?

    • 我们有一个Jenkins构建,它在Jenkins1.596.2上成功运行,我们正在迁移到运行Jenkins2.60.1的新构建机器 作为构建配置的一部分,我们有一个可扩展的Choice参数,并使用系统Groovy Choice参数作为选择提供者。然后,我们使用Groovy脚本获取选择列表。 此Groovy脚本需要访问Jenkins构建环境变量之一,该变量设置在构建配置的全局属性部分(在环境变量下)

    • 我正在检查使用JDT的方法的调用,并对其参数执行检查。我正在使用一个 AST 访问者类,该类访问方法调用节点并执行此操作。我在访客类中使用以下方法。 但是作为变量声明一部分的调用没有被访问。 例如:如果我正在寻找方法“createQuery”的调用,将访问以下调用。 但是这个没有被访问。 我怎样才能访问这样的语句并以正确的方式获取参数? 请帮忙。

    • 问题内容: 我正在开发Spotify应用。我可以登录并获取我的令牌。我的问题是我无法在方法外访问变量。在这种情况下 这是我的方法: 如您所见,我在console.log中记录了名称,并在控制台中获得了正确的值。但是仅在我调用即使返回names变量的情况下得到的函数的情况下,它也可以在这里使用。 我需要那个变量。 问题答案: 没有返回任何东西。你需要从返回的承诺,然后当你回到内 即 它是由外部函数返

    • 我正在使用gradle和bash脚本在docker图像中构建几个android应用程序。该脚本由运行docker映像的jenkins触发。在bash脚本中,我收集有关构建成功的信息。我想将该信息传递给jenkinsfile的groovy脚本。我试图在docker容器中创建一个txt文件,但jenkinsfile中的groovy脚本找不到该文件。这是我的jenkinsfile的groovy脚本: 在