首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Groovy -闭包和绑定,为什么这段代码不能工作?

Groovy -闭包和绑定,为什么这段代码不能工作?
EN

Stack Overflow用户
提问于 2010-09-10 23:42:38
回答 3查看 285关注 0票数 2

我认为这是一个新手问题,但为什么它在最后一个断言中失败了?我在想,闭包将值绑定在它上面,所以从闭包更改它将更改闭包外部的值。

代码语言:javascript
复制
def value = 5

def foo(n){

  return {

    ++n

  }
}

def test = foo(value)

assert test() == 6
assert test() == 7

assert value == 7

谢谢你的帮助。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-09-11 00:01:47

这似乎确实是一种奇怪的行为,但我认为这是正确的。所有对象的事件积分器都是通过引用传递的。调用foo( value )将value传递给函数。变量'n‘与'value’引用是同一个对象的引用。本质上,你有两个指向同一个对象的指针。当您递增'n‘时,您仅递增该变量。

由于Integer类是不可变的,因此++n实际上做的事情如下:

代码语言:javascript
复制
n = n + 1

这是将递增的值赋给变量n。在顶部声明的变量' value‘仍然指向原始对象5。

票数 2
EN

Stack Overflow用户

发布于 2010-09-10 23:58:03

记住,Integer (value的运行时类型)是不可变的。因此,尽管nvalue最初引用相同的对象,但当您执行++n时,它会创建一个新的Integervalue引用不会更新为引用这个新对象,因此当执行完成时,它仍然引用初始对象(5)。

票数 1
EN

Stack Overflow用户

发布于 2010-09-11 00:16:45

您正在为名称n指定一个与名称value不同的新值。您可以通过将value设置为可变对象来获得您想要的行为。然后,您可以对其进行更改,而不是创建和分配新对象。

下面是一个简单的示例,它将值包装在一个列表中:

代码语言:javascript
复制
def value = [5]

def foo(n){

    return {

        n[0]++
        n
    }
}

def test = foo(value)

assert test() == [6]
assert test() == [7]

assert value == [7]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3686059

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档