[groovy] Groovy에서 전역 변수를 생성하고 액세스하려면 어떻게해야합니까?

한 메서드의 변수에 값을 저장 한 다음 다른 메서드 또는 클로저에서 해당 변수의 값을 사용해야합니다. 이 가치를 어떻게 공유 할 수 있습니까?



답변

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 {
   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를 사용하지 않으면 전역


답변

모든 OO 언어와 마찬가지로 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);