Jak mogę utworzyć zmienne globalne w Groovy i uzyskać do nich dostęp?

128

Muszę przechowywać wartość w zmiennej w jednej metodzie, a następnie muszę użyć tej wartości z tej zmiennej w innej metodzie lub zamknięciu. Jak mogę podzielić się tą wartością?

srini
źródło

Odpowiedzi:

206

W skrypcie Groovy zakres może być inny niż oczekiwano. Dzieje się tak, ponieważ skrypt Groovy sam w sobie jest klasą z metodą, która uruchomi kod, ale wszystko jest gotowe w czasie wykonywania. Możemy zdefiniować zmienną, która ma być objęta zakresem skryptu, albo pomijając definicję typu, albo w Groovy 1.8 możemy dodać adnotację @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.
}
mrhaki
źródło
35
Wystarczy zauważyć, że Field @requires an import .. import groovy.transform.Field
khylo
funny próbował edytować, a potem zmienić na niż w pierwszej linii, więc chce edycji sześcioznakowej!
JimLohse,
1
jeśli próbujesz użyć zmiennej globalnej z definicji klasy, sprawa może być nieco skomplikowana. Poniższe class Globalsrozwiązanie pozwala to obejść.
solstice333
4
Wypróbowałem tę var1 = 'var1'metodę w Jenkins Pipeline przy użyciu Groovy i nie zadziałała. Musiałem użyć@Field var1 = 'var1'
retsigam
51
class Globals {
   static String ouch = "I'm global.."
}

println Globals.ouch
Bob Herrmann
źródło
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()

tutaj zmienna iamglobal jest zmienną globalną używaną przez func, a następnie ponownie dostępną dla func2

jeśli zadeklarujesz zmienną za pomocą def , będzie ona lokalna, jeśli nie użyjesz def, jej wartość globalna

Gaurav khurana
źródło
4

Podobnie jak wszystkie języki OO, Groovy nie ma samego pojęcia „globalnego” (w przeciwieństwie do, powiedzmy, BASICa, Pythona czy Perla).

Jeśli masz kilka metod, które wymagają współużytkowania tej samej zmiennej, użyj pola:

class Foo {
    def a;

    def foo() {
        a = 1;
    }
    def bar() {
        print a;
    }
}
Aaron Digulla
źródło
2

Po prostu zadeklaruj zmienną w zakresie klasy lub skryptu, a następnie uzyskaj do niej dostęp z wnętrza metod lub zamknięć. Jednak bez przykładu trudno jest określić konkretny problem.

Jednak zmienne globalne są ogólnie uważane za złą formę.

Dlaczego nie zwrócić zmiennej z jednej funkcji, a następnie przekazać ją do następnej?

tim_yates
źródło
1
co jeśli chcę użyć zmiennej, której wartość została przypisana w domknięciu? Np .: mam def a = null na początku skryptu. Teraz wewnątrz zamknięcia przypisywana jest wartość a = 'jakiś łańcuch'. Chcę, aby ta nowa wartość była dostępna dla wszystkich innych zamknięć. dzięki
OK999
Naprawdę? Znienawidzisz siebie, kiedy będziesz musiał spróbować to naprawić
tim_yates
Zakończyłem tworzenie zamknięcia, które zwraca żądaną obliczoną wartość i używając tego tam, gdzie jest to potrzebne
OK999
1

Myślę, że mówisz o zmiennych na poziomie klasy. Jak wspomniano powyżej, używanie zmiennych globalnych na poziomie zmiennych / klas nie jest dobrą praktyką.

Jeśli naprawdę chcesz go używać. i jeśli jesteś pewien, że nie będzie wpływu ...

Zadeklaruj dowolną zmienną poza metodą. na poziomie klasy bez typu zmiennej

na przykład:

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

// def a or int a wont work

a=0

}
Pruthvi Minchinadka
źródło
Może nie jest to czyste podejście, ale działa;) dzięki.
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);
Bae Cheol Shin
źródło
0

Nie możesz dowiedzieć się, czego chcesz, ale potrzebujesz czegoś takiego? :

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

Teraz bValuezawiera wartość, bktóra jest zmienną w zamknięciu a. Teraz możesz zrobić wszystko, korzystając z opcji bValueDaj mi znać, jeśli źle zrozumiałem Twoje pytanie

Mrówka
źródło