使用Scala闭包,何时捕获的变量开始存在于JVM堆上?

Seb*_*ber 5 scala

相关问题: 与Java内部类相比,Scala闭包 - >最终VS var

我想知道Scala什么时候将捕获的变量放在堆上而不是堆栈中.我正在阅读马丁奥德斯基的Scala书,但现在我没有找到这些信息.有人可以解释引擎盖后面的内容吗?

Rég*_*les 9

scala中的匿名函数(实际上是任何函数)实际上是一个对象(实例Function*).在实例化时,通过将val复制到函数对象的内部字段来完成val的捕获.在函数体中(即,在函数对象的apply方法中),通过访问这些字段来访问捕获的val.

vars的捕获是类似的,除了编译器必须添加一个间接级别:var值是通过一些隐藏的可变持有者(只是一个具有指向var的当前值的可变字段的对象)访问的,这就是这个复制到函数对象的holder.当写入var(通过本地代码或函数对象)时,它是写入的持有者字段.这种机制确保本地代码和函数的代码操纵相同的数据,并且看到彼此的修改.

所以答案是捕获的val和捕获的var都始终存在于堆上(无论是直接作为函数对象的字段,还是作为某个包装器对象的字段)