Respostas:
Em um script Groovy, o escopo pode ser diferente do esperado. Isso ocorre porque um script Groovy em si é uma classe com um método que executará o código, mas isso é tudo feito em tempo de execução. Podemos definir uma variável com escopo definido no script, omitindo a definição de tipo ou no Groovy 1.8, podemos adicionar a anotação @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
solução abaixo é uma maneira de contornar isso.
var1 = 'var1'
método em um pipeline Jenkins usando Groovy e não funcionou. Eu tive que usar@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()
aqui variável iamglobal é uma variável global usada por func e, em seguida, novamente disponível para func2
se você declarar variável com def, ela será local; se você não usar def, seu global
Como todas as linguagens OO, o Groovy não tem conceito de "global" por si só (ao contrário, digamos, BASIC, Python ou Perl).
Se você possui vários métodos que precisam compartilhar a mesma variável, use um campo:
class Foo {
def a;
def foo() {
a = 1;
}
def bar() {
print a;
}
}
Apenas declare a variável no escopo de classe ou script e acesse-a de dentro de seus métodos ou fechamentos. Sem um exemplo, é difícil ser mais específico para o seu problema específico.
No entanto, variáveis globais são geralmente consideradas más formas.
Por que não retornar a variável de uma função e passá-la para a próxima?
Eu acho que você está falando sobre variáveis em nível de classe. Como mencionado acima, o uso de variáveis globais / variáveis em nível de classe não é uma boa prática.
Se você realmente quer usá-lo. e se tiver certeza de que não haverá impacto ...
Declare qualquer variável fora do método. no nível da classe sem o tipo de variável
por exemplo:
{
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);
Não foi possível descobrir o que você deseja, mas precisa de algo assim? :
def a = { b -> b = 1 }
bValue = a()
println b // prints 1
Agora bValue
contém o valor de b
que é uma variável no fechamento a
. Agora você pode fazer qualquer coisa com bValue
Deixe-me saber se eu entendi sua pergunta