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

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

Ответ 1

В Groovy script область видимости может отличаться от ожидаемой. Это связано с тем, что Groovy script сам по себе является классом с методом, который будет запускать код, но это все сделано во время выполнения. Мы можем определить переменную, которая будет привязана к script, либо опустив определение типа, либо в 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.
}

Ответ 2

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

println Globals.ouch

Ответ 3

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

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

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

Ответ 4

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

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

class Foo {
    def a;

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

Ответ 5

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

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

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

например:

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

// def a or int a wont work

a=0

}

Ответ 6

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

Ответ 7

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

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

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

Ответ 8

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