Como crio e acesso as variáveis ​​globais no Groovy?


128

Preciso armazenar um valor em uma variável em um método e, em seguida, preciso usar esse valor dessa variável em outro método ou fechamento. Como posso compartilhar esse valor?

Respostas:


206

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.
}

35
Só para observar o Field @requires a import .. import groovy.transform.Field
khylo

engraçado tentou editar para mudar então para que na primeira linha, então quer uma edição de seis caracteres!
precisa saber é o seguinte

1
se você está tentando usar uma variável global dentro de uma definição de classe, fica um pouco complicado. A class Globalssolução abaixo é uma maneira de contornar isso.
solstice333

4
Eu tentei o var1 = 'var1'método em um pipeline Jenkins usando Groovy e não funcionou. Eu tive que usar@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()

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


4

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;
    }
}

2

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?


1
e se eu quiser usar a variável cujo valor foi atribuído em um fechamento? Por exemplo: eu tenho def a = null no início do script. Agora, dentro de um fechamento, o valor de a = 'some string' é atribuído. Quero que esse novo valor seja acessível a todos os outros fechamentos. obrigado
OK999 26/10

Realmente? Você vai odiar a si mesmo quando você tem que tentar consertá-lo
tim_yates

Eu terminei de criar um fechamento que retorna o valor calculado desejado e o uso onde for necessário
OK999

1

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

}

Pode não ser uma abordagem limpa, mas funciona;) obrigado.
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

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 bValuecontém o valor de bque é uma variável no fechamento a. Agora você pode fazer qualquer coisa com bValueDeixe-me saber se eu entendi sua pergunta

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.