Answers:
在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.
}
class Globals
下面的解决方案是一种解决方法。
var1 = 'var1'
在Groovy的Jenkins Pipeline中尝试了该方法,但该方法无效。我不得不使用@Field var1 = 'var1'
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,则它将是全局的
与所有OO语言一样,Groovy本身也没有“全局”的概念(不同于BASIC,Python或Perl)。
如果您有几种方法需要共享同一变量,请使用一个字段:
class Foo {
def a;
def foo() {
a = 1;
}
def bar() {
print a;
}
}
只需在类或脚本范围内声明变量,然后从您的方法或闭包内部进行访问即可。没有示例,就很难针对您的特定问题进行具体说明。
但是,全局变量通常被认为是错误的形式。
为什么不从一个函数返回变量,然后将其传递给下一个函数呢?
我认为您正在谈论类级别的变量。如上所述,使用全局变量/类级别变量不是一个好习惯。
如果您真的要使用它。如果您确定不会有影响...
在方法外声明任何变量。在类级别没有变量类型
例如:
{
method()
{
a=10
print(a)
}
// def a or int a wont work
a=0
}