Groovy - 闭包和绑定(bind),为什么这段代码不起作用?

标签 groovy closures

我认为这是一个新手问题,但为什么最后一个断言失败了? 我认为闭包绑定(bind)了它上面的值,因此从闭包中更改它会更改闭包外部的值。

def value = 5

def foo(n){

  return {

    ++n

  }
}

def test = foo(value)

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

assert value == 7

感谢您的帮助。

最佳答案

这确实看起来很奇怪,但我认为这是正确的。所有对象事件整数均通过引用传递。调用 foo(value) 将值传递给函数。变量“n”是对与“值”引用相同的对象的引用。本质上你有两个指向同一个对象的指针。当您增加“n”时,您只是增加了该变量。

由于 Integer 类是不可变的++n 实际上正在做类似的事情:

n = n + 1

这是将递增的值分配给变量 n。顶部声明的变量“value”仍然指向原始对象5。

关于Groovy - 闭包和绑定(bind),为什么这段代码不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3686059/

相关文章:

Grails groovy bool 值被返回为 null

groovy - 如何使用 Groovy Set 来获取独特元素?

java - 当从可运行的 jar 执行时,缺少resolveStrategy会破坏DSL

groovy - 在闭包中引用 Map 类型的属性时出错

python - 在解释器或编译器的上下文中,单元格是什么?

java - 构建后的 Gradle 复制任务

java - Grails 依赖解析

pointers - `go print(v)` 和 `go func() { print(v) }()` 之间的区别?

swift - 如何将闭包作为变量传递?

sql - 当我知道sql中每个簇中的点时计算簇数