Antworten:
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.
}
class Globals
Lösung ist ein Weg, um das zu umgehen.
var1 = 'var1'
Methode in einer Jenkins-Pipeline mit Groovy ausprobiert und sie hat nicht funktioniert. Ich musste@Field var1 = 'var1'
class Globals {
static String ouch = "I'm global.."
}
println Globals.ouch
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
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;
}
}
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?
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
}
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);
Konnten Sie nicht herausfinden, was Sie wollen, aber Sie brauchen so etwas? ::
def a = { b -> b = 1 }
bValue = a()
println b // prints 1
Nun bValue
enthält den Wert von b
dem eine Variable in der Schließung ist a
. Jetzt können Sie alles tun mit bValue
Lassen Sie mich wissen, wenn ich Ihre Frage falsch verstanden habe