web-dev-qa-db-fra.com

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

Je dois stocker une valeur dans une variable dans une méthode, puis utiliser cette valeur à partir de cette variable dans une autre méthode ou une autre clôture. Comment puis-je partager cette valeur?

106
srini

Dans un script Groovy, la portée peut être différente de celle attendue. En effet, 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 à inclure dans le script en omettant la définition du 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.
}
175
mrhaki
class Globals {
   static String ouch = "I'm global.."
}

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

here iamglobal variable est une variable globale utilisée par func et à nouveau disponible pour func2

si vous déclarez une variable avec def ce sera local, si vous n'utilisez pas def sa globale

18
Gaurav khurana

Comme toutes les langues OO, Groovy n’a pas de notion de "global" en soi (contrairement à, par exemple, 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;
    }
}
3
Aaron Digulla

Déclarez simplement la variable au niveau de la classe ou de la portée du script, puis accédez-y de l'intérieur de vos méthodes ou de vos fermetures. Sans 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 une mauvaise forme.

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

2
tim_yates
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);
1
Bae Cheol Shin

Je pense que vous parlez de variables de niveau de classe. Comme mentionné ci-dessus, l'utilisation de variables globales/de niveau 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

}
1

Impossible de 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

Maintenant, bValue contient la valeur de b qui est une variable dans la fermeture a. Maintenant, vous pouvez faire n'importe quoi avec bValue Faites-moi savoir si j'ai mal compris votre question

0
Ant's