Відповіді:
У сценарії Groovy масштабування може бути іншим, ніж очікувалося. Це тому, що сценарій Groovy сам по собі є класом з методом, який запустить код, але це все виконано під час виконання. Ми можемо визначити змінну, до якої слід звернутися до сценарію, пропустивши визначення типу, або в Groovy 1.8 ми можемо додати анотацію @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
Рішення нижче спосіб обійти це.
var1 = 'var1'
метод на трубопроводі Дженкінса за допомогою Groovy, і він не спрацював. Мені довелося скористатися@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()
тут змінна iamglobal - це глобальна змінна, яку використовує func і знову доступна для func2
якщо ви оголосите змінну з def, вона буде локальною, якщо ви не використовуєте def її глобальною
Як і всі мови OO, Groovy сам по собі не має поняття "глобального" (на відміну, скажімо, від BASIC, Python або Perl).
Якщо у вас є кілька методів, яким потрібно ділити одну змінну, використовуйте поле:
class Foo {
def a;
def foo() {
a = 1;
}
def bar() {
print a;
}
}
Просто оголосіть змінну в області класу чи сценарію, а потім отримайте доступ до неї зсередини своїх методів чи закриттів. Без прикладу, важко бути більш конкретним для вашої конкретної проблеми.
Однак глобальні змінні загалом вважаються поганою формою.
Чому б не повернути змінну з однієї функції, а потім передати її в наступну?
Я думаю, ви говорите про змінні рівня класу. Як було сказано вище, використання глобальних змінних на рівні змінних / класів не є хорошою практикою.
Якщо ви дійсно хочете використовувати його. і якщо ви впевнені, що впливу не буде ...
Оголосити будь-яку змінну стороною методу. на рівні класу з виключенням типу змінної
наприклад:
{
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);
Не можете зрозуміти, чого ви хочете, але вам потрібно щось подібне? :
def a = { b -> b = 1 }
bValue = a()
println b // prints 1
Тепер bValue
містить значення, b
яке є змінною у закритті a
. Тепер ви можете зробити все, що завгодно. bValue
Повідомте мене, чи я неправильно зрозумів ваше запитання