Як створити та отримати доступ до глобальних змінних у Groovy?


128

Мені потрібно зберігати значення в змінній в одному методі, а потім мені потрібно використовувати це значення з цієї змінної в іншому методі чи закритті. Як я можу поділитися цією цінністю?

Відповіді:


206

У сценарії 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Рішення нижче спосіб обійти це.
сонцестояння333

4
Я спробував var1 = 'var1'метод на трубопроводі Дженкінса за допомогою Groovy, і він не спрацював. Мені довелося скористатися@Field var1 = 'var1'
retsigam


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

Як і всі мови OO, Groovy сам по собі не має поняття "глобального" (на відміну, скажімо, від BASIC, Python або Perl).

Якщо у вас є кілька методів, яким потрібно ділити одну змінну, використовуйте поле:

class Foo {
    def a;

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

2

Просто оголосіть змінну в області класу чи сценарію, а потім отримайте доступ до неї зсередини своїх методів чи закриттів. Без прикладу, важко бути більш конкретним для вашої конкретної проблеми.

Однак глобальні змінні загалом вважаються поганою формою.

Чому б не повернути змінну з однієї функції, а потім передати її в наступну?


1
Що робити, якщо я хочу використовувати змінну, значення якої було призначено в межах закриття? Наприклад: у мене на початку сценарію є def a = null. Тепер присвоєно внутрішнє закриття, значення a = 'деякий рядок'. Я хочу, щоб ця нова цінність була доступною для всіх інших закриттів. дякую
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.