相关问题: 与Java内部类相比,Scala闭包 - >最终VS var
我想知道Scala什么时候将捕获的变量放在堆上而不是堆栈中.我正在阅读马丁奥德斯基的Scala书,但现在我没有找到这些信息.有人可以解释引擎盖后面的内容吗?
scala中的匿名函数(实际上是任何函数)实际上是一个对象(实例Function*).在实例化时,通过将val复制到函数对象的内部字段来完成val的捕获.在函数体中(即,在函数对象的apply方法中),通过访问这些字段来访问捕获的val.
vars的捕获是类似的,除了编译器必须添加一个间接级别:var值是通过一些隐藏的可变持有者(只是一个具有指向var的当前值的可变字段的对象)访问的,这就是这个复制到函数对象的holder.当写入var(通过本地代码或函数对象)时,它是写入的持有者字段.这种机制确保本地代码和函数的代码操纵相同的数据,并且看到彼此的修改.
所以答案是捕获的val和捕获的var都始终存在于堆上(无论是直接作为函数对象的字段,还是作为某个包装器对象的字段)
| 归档时间: |
|
| 查看次数: |
1060 次 |
| 最近记录: |