Groovy存储对class方法中使用的变量的引用,我将其转换为闭包。
在这个例子中
class Accumulator {
def count = 0
def accumulate() {
print (++count)
}
}
def ac_inst= new Accumulator()
3.times {
ac_inst.accumulate() //123
}
def accum = ac_inst.&accumulate
ac_inst = 5 // changed reference
8.times {
accum() //4567891011
}
我使用accum
对象的方法accumulate
创建了封闭ac_inst
- MyClass
的实例。
我将ac_inst
值更改为完全不同的对象,但是闭包调用继续增加count
值,尽管不再有ac_inst
个对象。
它存储该闭包所需的值?
答案 0 :(得分:2)
一个闭包有一个delegate
(可以修改)和一个owner
(严格来说不能)
所以它所涉及的实例存储在这里,只是改变它原来的值并不会改变它。
事实上,我能想到的几乎所有语言都是如此:
def list = [1,2,3]
def val = list[1]
list = [4,5,6]
println val // still 2
答案 1 :(得分:2)
当你写def accum = ac_inst.&accumulate
时,groovy创建一个MethodClosure
的实例(而不是一个覆盖Closure的新类)
此对象将实例存储在owner
字段中,方法名称存储在method
属性中。这不是'真正的封闭',call()只委托给他的主人。 owner
无法更改 - 它是常量 - 而delegate
可以。