Comment créer et accéder aux variables globales dans Groovy?


128

J'ai besoin de stocker une valeur dans une variable dans une méthode, puis je dois utiliser cette valeur de cette variable dans une autre méthode ou fermeture. Comment puis-je partager cette valeur?

Réponses:


207

Dans un script Groovy, la portée peut être différente de celle attendue. C'est parce qu'un script Groovy en lui-même est une classe avec une méthode qui exécutera le code, mais tout cela est fait à l'exécution. Nous pouvons définir une variable à étendre au script en omettant la définition de type ou dans Groovy 1.8, nous pouvons ajouter l'annotation @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
Juste pour noter que le champ @ nécessite une importation .. import groovy.transform.Field
khylo

drôle a essayé d'éditer pour changer alors en que dans la première ligne, SO veut une édition à six caractères!
JimLohse

1
si vous essayez d'utiliser une variable globale à partir d'une définition de classe, cela devient un peu délicat. La class Globalssolution ci-dessous est un moyen de contourner cela.
solstice333

4
J'ai essayé la var1 = 'var1'méthode dans un pipeline Jenkins en utilisant Groovy et cela n'a pas fonctionné. Je devais utiliser@Field var1 = 'var1'
retsigam

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

println Globals.ouch

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()

ici la variable iamglobal est une variable globale utilisée par func puis à nouveau disponible pour func2

si vous déclarez une variable avec def, elle sera locale, si vous n'utilisez pas def son global


4

Comme tous les langages OO, Groovy n'a pas de concept de "global" en lui-même (contrairement, disons, BASIC, Python ou Perl).

Si vous avez plusieurs méthodes qui doivent partager la même variable, utilisez un champ:

class Foo {
    def a;

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

2

Déclarez simplement la variable au niveau de la classe ou du script, puis accédez-y depuis vos méthodes ou fermetures. Sans un exemple, il est difficile d'être plus précis pour votre problème particulier.

Cependant, les variables globales sont généralement considérées comme de mauvaise forme.

Pourquoi ne pas renvoyer la variable d'une fonction, puis la passer à la suivante?


1
et si je veux utiliser la variable dont la valeur a été attribuée dans une clôture? Par exemple: j'ai def a = null au début du script. Maintenant, à l'intérieur d'une fermeture, la valeur de a = 'some string', est assignée. Je souhaite que cette nouvelle valeur soit accessible à toutes les autres fermetures. merci
OK999

Vraiment? Vous vous détesterez quand vous devrez essayer de le réparer
tim_yates

J'ai fini de créer une fermeture qui renvoie la valeur calculée souhaitée et de l'utiliser là où c'est nécessaire
OK999

1

Je pense que vous parlez de variables au niveau de la classe. Comme mentionné ci-dessus, l'utilisation de variables globales de niveau variable / classe n'est pas une bonne pratique.

Si vous voulez vraiment l'utiliser. et si vous êtes sûr qu'il n'y aura pas d'impact ...

Déclarez toute variable en dehors de la méthode. au niveau de la classe sans le type de variable

par exemple:

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

// def a or int a wont work

a=0

}

Ce n'est peut-être pas une approche claire, mais cela fonctionne;) merci.
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);

0

Vous ne pouvez pas comprendre ce que vous voulez, mais vous avez besoin de quelque chose comme ça? :

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

bValueContient maintenant la valeur bdont est une variable dans la fermeture a. Vous pouvez maintenant faire n'importe quoi avec bValueFaites-moi savoir si j'ai mal compris votre question

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.