gpt4 book ai didi

java - 当使用运算符重载在闭包甚至方法中更新时,不会发生对列表的更新

转载 作者:行者123 更新时间:2023-12-01 16:35:59 25 4
gpt4 key购买 nike

  1. 看起来当您将列表传递到方法/闭包时,Groovy 在闭包或方法中创建列表的副本并进行更新,以便退出后您的更改不会反射(reflect)出来!如果您使用 .add 方法则不会出现这种情况

  2. 为什么 Groovy 想要改变这种最直观的行为当您将加法与列表和运算符一起使用时,Java 开发人员重载+符号?

  3. 从 Groovy 的角度来看有什么好处?

  4. 如果我取消注释代码示例中的增强型 for 循环,并使用 + 号注释掉添加的列表 - 它的行为将按预期进行

*

List<String> b = ['man', 'lady']

def x = { List<String> p ->

println delegate.getClass().getName()
List<String> inx = ['dog','cat']
/*for (String l : inx)
{
p.add(l)
}*/
p = p + inx //value of p is not reflected whence you exit

}

def xmethod(List<String> p)
{
List<String> inx = ['monkey','lion']
/*for (String l : inx)
{
p.add(l)
}*/
p = p + inx // value of p is not reflected whence you exit

}

x( b )
println b

xmethod( b )
println b

最佳答案

给定:p = p + inx,其中 pinx 是列表

这可以读作:p = p.plus(inx),在 Groovy 中是一个重载方法返回传入的列表的新副本,当然内存中将会有一个新的地址。因此它不会更新传入的列表。

当方法返回并来自在其中创建的 List 的堆栈时已删除,不再存在。

在哪里使用 p.plus(inx)p + inx 非常重要特别是如果 p 被传递到你的方法中并且你想要你的更改将反射(reflect)回传入的原始 p请改用 p.addAll(inx) 方法。

顺便说一句, map 也是如此,我建议您引用:Groovy (or Java) - Pass by reference into a wrapper object

关于java - 当使用运算符重载在闭包甚至方法中更新时,不会发生对列表的更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61945101/

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