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
참고로 필드 @ 가져 오기가 필요합니다. import groovy.transform.Field
khylo

재밌는 편집을 시도한 다음 첫 번째 줄보다 변경하려고 했으므로 6 문자 편집을 원합니다!
JimLohse

1
클래스 정의 내에서 전역 변수를 사용하려는 경우 약간 까다로워집니다. class Globals아래 의 해결책은 그 문제를 해결하는 방법입니다.
solstice333 2011

4
var1 = 'var1'Groovy를 사용하여 Jenkins Pipeline에서 방법을 시도했지만 작동하지 않았습니다. 나는 사용해야했다@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 = 'some string'값이 할당됩니다. 이 새로운 가치가 다른 모든 클로저에 접근 할 수 있기를 바랍니다. 감사합니다
OK999

정말? 당신이 시도하고 그것을 해결해야 할 때 당신은 자신을 미워하는 것
tim_yates

원하는 계산 된 값을 반환하고 필요한 곳에 사용하는 클로저 생성을 끝냈습니다
OK999

1

나는 당신이 클래스 수준 변수에 대해 이야기하고 있다고 생각합니다. 위에서 언급했듯이 전역 변수 / 클래스 수준 변수를 사용하는 것은 좋은 방법이 아닙니다.

정말로 사용하고 싶다면. 영향이 없을 것이라고 확신한다면 ...

메서드 외부에 변수를 선언하십시오. 변수 유형이없는 클래스 수준에서

예 :

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

// def a or int a wont work

a=0

}

깨끗한 접근 방식은 아니지만 작동합니다.) 감사합니다.
Nicole Stutz

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내가 귀하의 질문을 오해 한 경우 알려주세요.로 무엇이든 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.