如何在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()