我认为这是一个新手问题,但为什么它在最后一个断言中失败了?我在想,闭包将值绑定在它上面,所以从闭包更改它将更改闭包外部的值。
def value = 5
def foo(n){
return {
++n
}
}
def test = foo(value)
assert test() == 6
assert test() == 7
assert value == 7谢谢你的帮助。
发布于 2010-09-11 00:01:47
这似乎确实是一种奇怪的行为,但我认为这是正确的。所有对象的事件积分器都是通过引用传递的。调用foo( value )将value传递给函数。变量'n‘与'value’引用是同一个对象的引用。本质上,你有两个指向同一个对象的指针。当您递增'n‘时,您仅递增该变量。
由于Integer类是不可变的,因此++n实际上做的事情如下:
n = n + 1这是将递增的值赋给变量n。在顶部声明的变量' value‘仍然指向原始对象5。
发布于 2010-09-10 23:58:03
记住,Integer (value的运行时类型)是不可变的。因此,尽管n和value最初引用相同的对象,但当您执行++n时,它会创建一个新的Integer。value引用不会更新为引用这个新对象,因此当执行完成时,它仍然引用初始对象(5)。
发布于 2010-09-11 00:16:45
您正在为名称n指定一个与名称value不同的新值。您可以通过将value设置为可变对象来获得您想要的行为。然后,您可以对其进行更改,而不是创建和分配新对象。
下面是一个简单的示例,它将值包装在一个列表中:
def value = [5]
def foo(n){
return {
n[0]++
n
}
}
def test = foo(value)
assert test() == [6]
assert test() == [7]
assert value == [7]https://stackoverflow.com/questions/3686059
复制相似问题