2012-03-04 2 views
2

모든 변수는 Groovy 스크립트 엔진에서 실행되는 그루비 스크립트에서 전역 적으로 보입니다. 나는 Groovy 클래스를 만들었지 만, 변수를 만들면 모든 곳에서 액세스 할 수 있습니다. 용서를 위해.Groovy Script Engine에서 로컬 범위 변수를 사용하는 방법은 무엇입니까?

class test{ 
    void func1{ a=4 } 
    void func2{ print(a) } 
} 

이 클래스 함수 func1을 scala에서 호출 한 다음 func2를 호출하면 "4"가됩니다. 이상하게도 함수에서 "def a = 0"과 같은 변수를 선언하면 변수의 범위가 함수에서 제한됩니다.

나는

var gse = new GroovyScriptEngine(pathList.toArray) 
var scriptClass = gse.loadScriptByName(file.getName()) 
var i = scriptClass.newInstance().asInstanceOf[GroovyObject] 

다음 홈 스크립트 클래스의 함수를 호출 할 invokeMethod를 사용하여이 (사용 스칼라)처럼 Groovy 스크립트에서 내 그루비 스크립트를로드하고 있습니다. 변수 범위를 기본적으로 함수에서 제한하도록 만들 수 있습니까?

답변

2

예상되는 동작으로 Scoping and the Semantics of "def"에 설명되어 있습니다.

선언되지 않은 변수를 Groovy 스크립트에서 사용하면 바인딩 변수가 작성됩니다. 바인딩 변수는 스크립트에서 전역 변수입니다. def으로 변수를 선언하면 함수가 로컬이됩니다.

이 동작은 코드를 스크립트로로드하기 때문에 적용됩니다. 나는 그것을 바꿀 수 있다고 믿지 않는다. 지역 변수가 필요할 때 선언 (def 또는 유형)을 사용하십시오. 당신은 또한 @Field 주석을 사용하여 바인딩 변수 (전역)을 정의 할 수 있습니다

참고 :

class test { 
    void func1{ @Field int a=4 } 
    void func2{ print(a) } 
} 

그것은 나를 귀찮게했다 주셔서 감사합니다

class test { 
    void func1{ a=4 } 
    void func2{ print(a) } 
} 
+0

에 해당 – Elonoa

관련 문제