Wie erstelle ich die globalen Variablen in Groovy und greife darauf zu?

128

Ich muss einen Wert in einer Variablen in einer Methode speichern und dann diesen Wert aus dieser Variablen in einer anderen Methode oder einem anderen Abschluss verwenden. Wie kann ich diesen Wert teilen?

Srini
quelle

Antworten:

206

In einem Groovy-Skript kann das Scoping anders sein als erwartet. Das liegt daran, dass ein Groovy-Skript an sich eine Klasse mit einer Methode ist, mit der der Code ausgeführt wird, die jedoch alle zur Laufzeit ausgeführt wird. Wir können eine Variable definieren, die dem Skript zugeordnet werden soll, indem wir entweder die Typdefinition weglassen oder in Groovy 1.8 die Annotation @Field hinzufügen.

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.
}
mrhaki
quelle
35
Nur um zu beachten, Feld @ erfordert einen Import .. Import groovy.transform.Field
khylo
lustig versucht zu bearbeiten, um dann zu ändern, als in der ersten Zeile, so will eine sechs Zeichen bearbeiten!
JimLohse
1
Wenn Sie versuchen, eine globale Variable aus einer Klassendefinition heraus zu verwenden, wird dies etwas schwierig. Die folgende class GlobalsLösung ist ein Weg, um das zu umgehen.
Sonnenwende333
4
Ich habe die var1 = 'var1'Methode in einer Jenkins-Pipeline mit Groovy ausprobiert und sie hat nicht funktioniert. Ich musste@Field var1 = 'var1'
Retsigam
51
class Globals {
   static String ouch = "I'm global.."
}

println Globals.ouch
Bob Herrmann
quelle
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()

hier iamglobal Variable ist eine globale Variable durch verwendet Func und dann wieder zur Verfügung zu func2

Wenn Sie eine Variable mit def deklarieren, ist sie lokal, wenn Sie def nicht global verwenden

Gaurav Khurana
quelle
4

Wie alle OO-Sprachen hat Groovy kein Konzept von "global" für sich (im Gegensatz zu beispielsweise BASIC, Python oder Perl).

Wenn Sie mehrere Methoden haben, die dieselbe Variable gemeinsam nutzen müssen, verwenden Sie ein Feld:

class Foo {
    def a;

    def foo() {
        a = 1;
    }
    def bar() {
        print a;
    }
}
Aaron Digulla
quelle
2

Deklarieren Sie die Variable einfach im Klassen- oder Skriptbereich und greifen Sie dann über Ihre Methoden oder Abschlüsse darauf zu. Ohne ein Beispiel ist es jedoch schwierig, spezifischer auf Ihr spezielles Problem einzugehen.

Globale Variablen werden jedoch im Allgemeinen als schlechte Form angesehen.

Warum nicht die Variable von einer Funktion zurückgeben und dann an die nächste übergeben?

tim_yates
quelle
1
Was ist, wenn ich die Variable verwenden möchte, deren Wert innerhalb eines Abschlusses zugewiesen wurde? Beispiel: Ich habe am Anfang des Skripts def a = null. Jetzt wird innerhalb eines Verschlusses der Wert von a = 'some string' zugewiesen. Ich möchte, dass dieser neue Wert für alle anderen Schließungen zugänglich ist. danke
OK999
"Ja wirklich?" Sie werden sich selbst hassen, wenn Sie versuchen müssen, es zu beheben
tim_yates
Ich beendete die Erstellung eines Abschlusses, der den gewünschten berechneten Wert zurückgibt und diesen dort verwendet, wo er benötigt wird
OK999
1

Ich denke, Sie sprechen über Variablen auf Klassenebene. Wie oben erwähnt, ist die Verwendung von Variablen auf globaler Variablen- / Klassenebene keine gute Praxis.

Wenn du es wirklich benutzen willst. und wenn Sie sicher sind, dass es keine Auswirkungen geben wird ...

Deklarieren Sie eine Variable außerhalb der Methode. auf Klassenebene ohne Variablentyp

z.B:

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

// def a or int a wont work

a=0

}
Pruthvi Minchinadka
quelle
Es ist vielleicht kein sauberer Ansatz, aber es funktioniert;) danke.
Nicole Stutz
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);
Bae Cheol Shin
quelle
0

Konnten Sie nicht herausfinden, was Sie wollen, aber Sie brauchen so etwas? ::

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

Nun bValueenthält den Wert von bdem eine Variable in der Schließung ist a. Jetzt können Sie alles tun mit bValueLassen Sie mich wissen, wenn ich Ihre Frage falsch verstanden habe

Ameisen
quelle