Ответы:
В сценарии 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'
метод в конвейере Jenkins с использованием 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 ее глобальный
Как и все объектно-ориентированные языки, 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
Дайте мне знать, если я неправильно понял ваш вопрос