2013-01-17 2 views
0

Groovy가 범위와 변수를 함수간에 전달할 때 그 변수를 관리하는 방법을 이해하는 데 도움이되고 싶습니다. 내 메인 메소드에서 def foo을 선언하고 private void 메소드 인 changeStuff에 인수로 전달한다고 가정 해 보겠습니다.변수의 Groovy 범위, 할당 및 참조

public static void main(args) { 
    def foo = [:]; 
    changeStuff(foo); 
    println(foo); 
} 
private static void changeStuff(foo) { 
    foo.bar = "new stuff"; 
} 

인쇄 결과는 [bar:new stuff]입니다하지만 다른 방법으로 foo는 조작 힘든 시간을 다음과 같이 그럼 변경할 수 있습니다.

public static void main(args) { 
    def foo = [:]; 
    changeStuff(foo); 
    println(foo); 
} 
private static void changeStuff(foo) { 
    def newStuff = [:] 
    newStuff.extra = "extra stuff"; 
    foo = newStuff; 
} 

인쇄 : [:]

public static void main(args) { 
    def foo = "before"; 
    changeStuff(foo); 
    println(foo); 
} 
private static void changeStuff(foo) { 
    foo = "after"; 
} 

인쇄 before

좀 개념이 나는 어쩌면 def 관련, 완전히 이해하지 오전 여기가 알고이 다음 두 가지 예를 참조하십시오? 이것에 대해 더 자세히 알 수있는 요약이나 방향이 있으면 감사하겠습니다.

+3

Groovy는 Java와 유사합니다. http://stackoverflow.com/questions/40480/is-java-pass-by-reference –

+0

좋은 기사, 감사합니다. –

답변

1

내 Groovy에서의 경험은 매우 제한되어 있으므로 약간 벗어날 수 있습니다.

처음 언급 한 경우 changeStuff을 참조하여 foo을 전달하며이 메서드 내에서 직접지도를 수정하므로 변경 사항은 main 메서드에서 볼 수 있습니다.

changeStuff 메서드 내의 foo 매개 변수가 다른지도에 할당되고 있습니다. 그러나 foomain 메서드 내에서 변수는 여전히 사용자가 만든 첫 번째지도를 가리키고, 따라서 인쇄 할 때 빈지도를 가리 킵니다.

세 번째 경우는 두 번째 경우와 동일합니다. 또한, Java에서 String 오브젝트 (그리고 아마도 Groovy에서도 가능)가 변경 불가능하다는 것을 알고 있어야합니다. "String"을 "수정"할 때마다 실제로 수행중인 작업은 매번 새 인스턴스를 만드는 것입니다.