2013-01-17 70 views
0

我想幫助理解Groovy在函數之間傳遞時如何管理範圍和變量。假設我在主要方法中聲明def foo並將其作爲參數傳遞給private void method,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]但我有一個很難用其他方式操縱富:然後我就可以像如下修改。看到這下面兩個例子:

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中的經驗非常有限,所以我可能會有點失落。

在你提到的第一種情況下,你是通過引用傳遞foochangeStuff和方法裏面,您可以直接修改地圖,這樣的變化是從main方法可見。

在第二種情況下,changeStuff方法中的參數foo正被分配給另一個地圖。但main方法中的變量foo仍然指向您創建的第一張地圖,因此在您打印時會顯示空白地圖。

第三種情況與第二種情況相同。另外,你必須知道在Java中(也可能在Groovy中)String對象是不可變的。所以當「修改」String時,你真正在做的是每次創建一個新的實例。