2011-06-10 24 views

Odpowiedz

2

Po prostu zadeklaruj zmienną w klasie lub zakresie skryptu, a następnie uzyskaj dostęp do niej z poziomu swoich metod lub zamknięć. Bez przykładu trudno jest być bardziej konkretnym dla konkretnego problemu.

Jednak zmienne globalne są generalnie uważane za złe.

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

+0

co jeśli chcę użyć zmiennej, której wartość została przypisana ned w zamknięciu? E.g: mam def = null na początku skryptu. Teraz wewnątrz zamknięcia jest przypisana wartość a = "jakiś ciąg". Chcę, aby ta nowa wartość była dostępna dla wszystkich innych zamknięć. dzięki – OK999

+0

Naprawdę? Nienawidzisz siebie, kiedy musisz spróbować to naprawić. –

+0

Zakończyłem tworzenie zamknięcia, które zwraca żądaną wyliczoną wartość i używa tam, gdzie potrzebne jest – OK999

1

Podobnie jak wszystkie języki obce, Groovy nie ma pojęcia "globalnego" samo w sobie (w przeciwieństwie do, powiedzmy, BASIC, Python lub Perl).

Jeśli masz kilka metod, które muszą dzielić tę samą zmienną, użyj pola:

30
class Globals { 
    static String ouch = "I'm global.." 
} 

println Globals.ouch 
0

nie mógł dowiedzieć się, co chcesz, ale trzeba coś takiego? :

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

Teraz bValue zawiera wartość b, która jest zmienna w zamknięciu a. Teraz możesz zrobić wszystko dzięki bValue Daj mi znać, jeśli źle zrozumiałem twoje pytanie:

131

W skrypcie Groovy zakres może być inny niż oczekiwano. Dzieje się tak dlatego, że sam skrypt Groovy jest klasą z metodą, która uruchomi kod, ale to wszystko jest zrobione. Możemy zdefiniować zmienną, która ma mieć zasięg do skryptu, pomijając definicję typu lub 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. 
} 
+2

+1 do używania nowych rzeczy w Groovy 1.8: D –

+20

Zauważ, że Field @ wymaga importu .. import groovy.transform.Field – khylo

+0

Zabawna próba edycji, aby zmienić to na niż w pierwszym wierszu, SO chce edycji sześciu znaków! – JimLohse

1

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

Jeśli naprawdę chcesz z niego korzystać. i jeśli masz pewność, że nie będzie wpływu ...

Deklaracja dowolnej zmiennej obok metody. na poziomie klasy z zewnątrz typu zmiennej

np

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

// def a or int a wont work 

a=0 

} 
+0

To może nie być czyste podejście, ale działa;) dzięki. –

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); 
2
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 iamglobal zmienna jest zmienną globalną wykorzystywane przez func a następnie ponownie do dyspozycji func2

Powiązane problemy