如何在Groovy中创建和访问全局变量?


128

我需要在一个方法中将值存储在变量中,然后在另一方法或闭包中使用该变量中的值。我如何分享这个价值?

Answers:


206

在Groovy脚本中,作用域可能与预期不同。那是因为Groovy脚本本身就是一个带有将运行代码的方法的类,但这一切都在运行时完成。我们可以通过省略类型定义或在Groovy 1.8中添加@Field批注来定义要在脚本作用域内定义的变量。

import groovy.transform.Field

var1 = 'var1'
@Field String var2 = 'var2'
def var3 = 'var3'

void printVars() {
    println var1
    println var2
    println var3 // This won't work, because not in script scope.
}

35
只是要注意Field @requires import .. import groovy.transform.Field
khylo 2013年

有趣的尝试进行编辑更改,然后更改为第一行中的内容,因此希望进行6个字符的编辑!
JimLohse

1
如果您要尝试在类定义中使用全局变量,则会有些棘手。class Globals下面的解决方案是一种解决方法。
solstice333

4
var1 = 'var1'在Groovy的Jenkins Pipeline中尝试了该方法,但该方法无效。我不得不使用@Field var1 = 'var1'
retsigam,


36
def iamnotglobal=100 // This will not be accessible inside the function

iamglobal=200 // this is global and will be even available inside the 

def func()
{
    log.info "My value is 200. Here you see " + iamglobal
    iamglobal=400
    //log.info "if you uncomment me you will get error. Since iamnotglobal cant be printed here " + iamnotglobal
}
def func2()
{
   log.info "My value was changed inside func to 400 . Here it is = " + iamglobal
}
func()
func2()

在这里,iamglobal变量是func使用的全局变量,然后再次可用于func2

如果用def声明变量,它将是局部的;如果不使用def,则它将是全局的


4

与所有OO语言一样,Groovy本身也没有“全局”的概念(不同于BASIC,Python或Perl)。

如果您有几种方法需要共享同一变量,请使用一个字段:

class Foo {
    def a;

    def foo() {
        a = 1;
    }
    def bar() {
        print a;
    }
}

2

只需在类或脚本范围内声明变量,然后从您的方法或闭包内部进行访问即可。没有示例,就很难针对您的特定问题进行具体说明。

但是,全局变量通常被认为是错误的形式。

为什么不从一个函数返回变量,然后将其传递给下一个函数呢?


1
如果我想使用在闭包内分配了值的变量怎么办?例如:我在脚本开始处定义了def a = null。现在,在闭包内部分配了='some string'的值。我希望所有其他闭包都可以访问此新值。谢谢
OK999 17-10-26

真?当您必须尝试修复它时,您会讨厌自己
tim_yates

我结束了创建一个闭包的操作,该闭包返回了所需的计算值,并在需要的地方使用了它
OK999,2017年

1

我认为您正在谈论类级别的变量。如上所述,使用全局变量/类级别变量不是一个好习惯。

如果您真的要使用它。如果您确定不会有影响...

在方法外声明任何变量。在类级别没有变量类型

例如:

{
   method()
   {
      a=10
      print(a)
   }

// def a or int a wont work

a=0

}

这可能不是一个干净的方法,但是它有效;)谢谢。
妮可·斯图斯

1
def sum = 0

// This method stores a value in a global variable.
def add =
{ 
    input1 , input2 ->
    sum = input1 + input2;
}

// This method uses stored value.
def multiplySum =   
{
    input1 ->
        return sum*input1;
}

add(1,2);
multiplySum(10);

0

无法弄清楚您想要什么,但是您需要这样的东西?:

def a = { b -> b = 1 }
bValue = a()
println b // prints 1

现在bValue包含其值b是闭包中的变量a。现在,您可以执行任何操作,bValue如果我误解了您的问题,请告诉我

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.