Groovyでグローバル変数を作成してアクセスするにはどうすればよいですか?


128

1つのメソッドで変数に値を格納する必要があり、その変数の値を別のメソッドまたはクロージャーで使用する必要があります。この値を共有するにはどうすればよいですか?

回答:


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
フィールドに注意してください@requires a import .. import groovy.transform.Field
khylo

おかしいは、最初の行よりも次に変更するように編集しようとしました、SOは6文字の編集を望んでいます!
JimLohse

1
クラス定義内からグローバル変数を使用しようとすると、少しトリッキーになります。class Globals以下の解決策はその回避策です。
solstice333

4
私は、var1 = 'var1'Groovyを使用してJenkins Pipelineでこのメソッドを試しましたが、機能しませんでした。私は使用しなければなり@Field var1 = 'var1'
ませんでした


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があります。これで、クロージャーの内側にa = 'some string'の値が割り当てられます。この新しい値が他のすべてのクロージャにアクセスできるようにしたい。ありがとう
OK999

本当に?あなたがそれを試して修正しなければならないとき、あなたは自分自身を憎むでしょう
tim_yates

私は戻って希望計算値クロージャを作成し、使用して終了したことをその必要な場所
OK999

1

あなたはクラスレベルの変数について話していると思います。上記のように、グローバル変数/クラスレベルの変数を使用することはお勧めできません。

本当に使いたいなら。そして、あなたが影響がないと確信しているなら...

メソッドの外で変数を宣言します。変数タイプなしのクラスレベル

例えば:

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

// def a or int a wont work

a=0

}

それはクリーンなアプローチではないかもしれませんが、それは機能します;)ありがとう。
Nicole Stutz、2016

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値が含まれます。これで、質問を誤解した場合は「私に知らせて」で何でもできますbabValue

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.