Groovy范围,赋值和变量引用

时间:2013-01-17 20:02:03

标签: java groovy scope variable-assignment

我想帮助理解Groovy在函数之间传递时如何管理范围和变量。假设我在main方法中声明def foo并将其作为参数传递给私有void方法changeStuff。然后我可以进行如下更改:

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有关?任何关于我可以了解更多相关信息的摘要或指示都表示赞赏。

1 个答案:

答案 0 :(得分:1)

我在groovy的经历非常有限,所以我可能会稍微偏离。

在您提到的第一种情况中,您通过引用foo传递changeStuff,并且在方法内部,您可以直接修改地图,因此您的main方法可以看到更改

在第二种情况下,foo方法中的参数changeStuff正在分配给另一个地图。但是,foo方法中的变量main仍然指向您创建的第一个地图,因此在打印时会显示空地图。

第三种情况与第二种情况相同。另外,您必须意识到Java中的String对象(也可能在Groovy中)是不可变的。所以当“修改”String时,你真正在做的是每次创建一个新实例。