gpt4 book ai didi

java - Groovy 变量的作用域、赋值和引用

转载 作者:行者123 更新时间:2023-12-01 14:55:03 25 4
gpt4 key购买 nike

我希望帮助您了解 Groovy 在函数之间传递时如何管理作用域和变量。假设我在 main 方法中声明 def foo 并将其作为参数传递给私有(private) 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";
}

打印之前

我知道这里有一些我没有完全理解的概念,可能与def有关?任何关于我可以在哪里了解更多相关信息的总结或指示将不胜感激。

最佳答案

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

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

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

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

关于java - Groovy 变量的作用域、赋值和引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14387156/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com