相关问题:Scala 闭包与 Java 内部类的比较 -> Final VS var
我想知道 Scala 何时使捕获到闭包中的变量存在于堆而不是堆栈上。我正在阅读 Martin Odersky 的 Scala 书,但目前我没有找到此信息。有人能解释一下引擎盖后面是什么吗?
scala 中的匿名函数(实际上是任何函数)实际上是一个对象(Function*
)。当它被实例化时,vals 的捕获是通过将 vals 复制到函数对象的内部字段来完成的。在函数体中(即在函数对象的apply
方法)对捕获的值的访问是通过访问这些字段来完成的。
var 的捕获是类似的,只是编译器必须添加一个间接级别:var 值是通过一些隐藏的可变持有者访问的(只是一个带有指向 var 当前值的可变字段的对象),这就是这个复制到函数对象中的持有者。当写入 var 时(通过本地代码或通过函数对象),写入的是持有者的字段。这种机制确保本地代码和函数代码操作相同的数据,并且两者都能看到彼此的修改。
所以答案是捕获的 vals 和捕获的 var 都始终存在于堆上(无论是直接作为函数对象的字段,还是作为某些包装对象的字段)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)