Come creo e accedo alle variabili globali in Groovy?


128

Devo memorizzare un valore in una variabile in un metodo e quindi devo utilizzare quel valore da quella variabile in un altro metodo o chiusura. Come posso condividere questo valore?

Risposte:


207

In uno script Groovy l'ambito può essere diverso da quello previsto. Questo perché uno script Groovy di per sé è una classe con un metodo che eseguirà il codice, ma è tutto eseguito in runtime. Possiamo definire una variabile da definire come ambito per lo script omettendo la definizione del tipo oppure in Groovy 1.8 possiamo aggiungere l'annotazione @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
Solo per notare Field @requires an import .. import groovy.transform.Field
khylo

divertente ha provato a modificare per passare poi a che nella prima riga, SO vuole una modifica di sei caratteri!
JimLohse

1
se stai cercando di utilizzare una variabile globale dall'interno di una definizione di classe, diventa un po 'complicato. La class Globalssoluzione di seguito è un modo per aggirare il problema.
solstice333

4
Ho provato il var1 = 'var1'metodo in una pipeline Jenkins usando Groovy e non ha funzionato. Ho dovuto usare@Field var1 = 'var1'
retsigam il

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

qui la variabile iamglobal è una variabile globale usata da func e quindi nuovamente disponibile per func2

se dichiari variabile con def sarà locale, se non usi def è globale


4

Come tutti i linguaggi OO, Groovy non ha il concetto di "globale" da solo (a differenza, diciamo, BASIC, Python o Perl).

Se disponi di diversi metodi che devono condividere la stessa variabile, utilizza un campo:

class Foo {
    def a;

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

2

Basta dichiarare la variabile nell'ambito della classe o dello script, quindi accedervi dall'interno dei metodi o delle chiusure. Senza un esempio, però, è difficile essere più specifici per il tuo problema particolare.

Tuttavia, le variabili globali sono generalmente considerate una cattiva forma.

Perché non restituire la variabile da una funzione, quindi passarla alla successiva?


1
cosa succede se voglio utilizzare la variabile il cui valore è stato assegnato all'interno di una chiusura? Ad esempio: ho def a = null all'inizio dello script. Ora all'interno di una chiusura, viene assegnato il valore di a = 'some string'. Voglio che questo nuovo valore sia accessibile a tutte le altre chiusure. grazie
OK999

Veramente? Ti
odierai

Ho finito creando una chiusura che restituisse il valore calcolato desiderato e usando quello dove era necessario
OK999

1

Penso che tu stia parlando di variabili a livello di classe. Come accennato in precedenza, l'utilizzo di variabili globali / variabili a livello di classe non è una buona pratica.

Se vuoi davvero usarlo. e se sei sicuro che non ci sarà impatto ...

Dichiarare qualsiasi variabile al di fuori del metodo. a livello di classe senza il tipo di variabile

per esempio:

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

// def a or int a wont work

a=0

}

Potrebbe non essere un approccio pulito, ma funziona;) grazie.
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

Non riesci a capire cosa vuoi, ma hai bisogno di qualcosa di simile? :

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

Ora bValuecontiene il valore di bcui è una variabile nella chiusura a. Ora puoi fare qualsiasi cosa con bValueFammi sapere se ho frainteso la tua domanda

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.