Как в Groovy создавать глобальные переменные и обращаться к ним?


128

Мне нужно сохранить значение в переменной в одном методе, а затем мне нужно использовать это значение из этой переменной в другом методе или закрытии. Как я могу поделиться этой ценностью?

Ответы:


207

В сценарии 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.
}

35
Просто обратите внимание, что Field @ требует импорта .. import groovy.transform.Field
khylo

смешно попытался отредактировать, чтобы изменить то на чем в первой строке, ТАК хочет редактирование с шестью символами!
JimLohse

1
если вы пытаетесь использовать глобальную переменную из определения класса, это становится немного сложнее. Приведенное class Globalsниже решение - способ обойти это.
solstice333

4
Я попробовал этот var1 = 'var1'метод в конвейере Jenkins с использованием Groovy, и он не сработал. Пришлось использовать@Field var1 = 'var1'
рецигам 02


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()

здесь iamglobal переменная - это глобальная переменная, используемая func, а затем снова доступная для func2

если вы объявляете переменную с помощью def, она будет локальной, если вы не используете def ее глобальный


4

Как и все объектно-ориентированные языки, Groovy не имеет самого по себе понятия «глобальный» (в отличие, скажем, от BASIC, Python или Perl).

Если у вас есть несколько методов, которые должны использовать одну и ту же переменную, используйте поле:

class Foo {
    def a;

    def foo() {
        a = 1;
    }
    def bar() {
        print a;
    }
}

2

Просто объявите переменную в области класса или скрипта, а затем получите к ней доступ из ваших методов или закрытий. Однако без примера трудно быть более конкретным для вашей конкретной проблемы.

Однако глобальные переменные обычно считаются дурным тоном.

Почему бы не вернуть переменную из одной функции, а затем передать ее в следующую?


1
что, если я хочу использовать переменную, значение которой было присвоено в закрытии? Например: у меня есть def a = null в начале скрипта. Теперь внутри замыкания присваивается значение a = 'some string'. Я хочу, чтобы это новое значение было доступно для всех других замыканий. спасибо
OK999

В самом деле? Ты возненавидишь себя, когда тебе придется это исправить
tim_yates

Я закончил создание замыкания, которое возвращает желаемое вычисленное значение и использует его там, где это необходимо
OK999

1

Я думаю, вы говорите о переменных уровня класса. Как упоминалось выше, использование глобальных переменных / переменных уровня класса не является хорошей практикой.

Если вы действительно хотите его использовать. и если вы уверены, что удара не будет ...

Объявите любую переменную вне метода. на уровне класса без типа переменной

например:

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

// def a or int a wont work

a=0

}

Возможно, это не чистый подход, но он работает;) спасибо.
Николь Штутц

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);

0

Не могли сообразить, что вы хотите, а вам нужно что-то подобное? :

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

Теперь bValueсодержит значение bпеременной в замыкании a. Теперь вы можете делать все, что угодно, с помощью bValueДайте мне знать, если я неправильно понял ваш вопрос

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.