Odpowiedzi:
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.
}
class Globals
rozwiązanie pozwala to obejść.
var1 = 'var1'
metodę w Jenkins Pipeline przy użyciu Groovy i nie zadziałała. Musiałem użyć@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()
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
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;
}
}
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?
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
}
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);
Nie możesz dowiedzieć się, czego chcesz, ale potrzebujesz czegoś takiego? :
def a = { b -> b = 1 }
bValue = a()
println b // prints 1
Teraz bValue
zawiera wartość, b
która jest zmienną w zamknięciu a
. Teraz możesz zrobić wszystko, korzystając z opcji bValue
Daj mi znać, jeśli źle zrozumiałem Twoje pytanie