【问题标题】:Groovy scope, assignment, and reference of variablesGroovy 变量的作用域、赋值和引用
【发布时间】:2013-01-17 20:02:03
【问题描述】:

我想帮助理解 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有关?任何关于我可以在哪里了解更多信息的总结或指导表示赞赏。

【问题讨论】:

标签: java groovy scope variable-assignment


【解决方案1】:

我在 groovy 方面的经验非常有限,所以我可能会有点偏离。

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

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

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

【讨论】:

    猜你喜欢
    • 2020-03-04
    • 2021-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-30
    • 1970-01-01
    • 2014-01-10
    • 2016-12-18
    相关资源
    最近更新 更多