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

如何在Groovy中创建和访问全局变量?,groovy,Groovy,我需要在一个方法的变量中存储一个值,然后在另一个方法或闭包中使用该变量中的值。如何共享此值?只需在类或脚本范围内声明变量,然后从方法或闭包内部访问它。但是,如果没有一个例子,就很难更具体地解决您的特定问题 然而,全局变量通常被认为是不好的形式 为什么不从一个函数返回变量,然后将其传递到下一个函数?与所有OO语言一样,Groovy本身没有“全局”的概念(不像BASIC、Python或Perl) 如果有多个方法需要共享同一变量,请使用以下字段: class Foo { def a;

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

只需在类或脚本范围内声明变量,然后从方法或闭包内部访问它。但是,如果没有一个例子,就很难更具体地解决您的特定问题

然而,全局变量通常被认为是不好的形式


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

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

如果有多个方法需要共享同一变量,请使用以下字段:

class Foo {
    def a;

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

想不出你想要什么,但你需要这样的东西

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

现在
bValue
包含
b
的值,它是闭包
a
中的一个变量。现在您可以使用
bValue做任何事情了
如果我误解了您的问题,请告诉我

在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.
}

我想你说的是类级变量。 如上所述,使用全局变量/类级别变量不是一种好的做法

如果你真的想用它。如果你确定不会有影响

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

例如:

这里的
i_am_global
变量是
func
使用的一个全局变量,然后又可用于
func2


如果您使用
def
声明变量,它将是本地变量,如果您不使用def,它的全局变量将需要导入。。import groovy.transform.fieldfuncy尝试编辑以更改,然后更改为,而不是第一行中的,因此需要六个字符的编辑!如果您试图在类定义中使用全局变量,则会有点棘手。下面的
class Globals
解决方案就是一种解决方法。我在使用Groovy的Jenkins管道中尝试了
var1='var1'
方法,但没有成功。我不得不使用
@Field var1='var1'
这可能不是一种干净的方法,但它可以工作;)谢谢。如果我想使用在闭包中赋值的变量怎么办?例如:我在脚本开头有defa=null。现在,在闭包内部,分配了a='some string'的值。我希望所有其他闭包都可以访问这个新值。谢谢你?当你不得不尝试修复itI时,你会讨厌你自己。我创建了一个返回所需计算值的闭包,并在需要的地方使用它
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.
}
{
   method()
   {
      a=10
      print(a)
   }

// def a or int a wont work

a=0

}
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);
def i_am_not_global = 100 // This will not be accessible inside the function

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

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