Risposte:
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.
}
class Globals
soluzione di seguito è un modo per aggirare il problema.
var1 = 'var1'
metodo in una pipeline Jenkins usando Groovy e non ha funzionato. Ho dovuto usare@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()
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
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;
}
}
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?
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
}
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);