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

时间:2011-06-10 11:44:43

标签: groovy

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

8 个答案:

答案 0 :(得分:157)

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

答案 1 :(得分:43)

class Globals {
   static String ouch = "I'm global.."
}

println Globals.ouch

答案 2 :(得分:15)

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其全局

答案 3 :(得分:3)

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

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

class Foo {
    def a;

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

答案 4 :(得分:2)

只需在类或脚本范围声明变量,然后从方法或闭包中访问它。如果没有一个例子,很难对你的特定问题更加具体。

但是,全局变量通常被视为不良形式。

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

答案 5 :(得分:1)

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

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

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

例如:

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

// def a or int a wont work

a=0

}

答案 6 :(得分: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);

答案 7 :(得分:0)

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

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

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