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

2023-11-22

相关问题:Scala 闭包与 Java 内部类的比较 -> Final VS var

我想知道 Scala 何时使捕获到闭包中的变量存在于堆而不是堆栈上。我正在阅读 Martin Odersky 的 Scala 书,但目前我没有找到此信息。有人能解释一下引擎盖后面是什么吗?


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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 根据 Slick 中的 Id 选择单行

    我想根据 Id 查询用户的一行 我有以下虚拟代码 case class User id Option Int name String object Users extends Table User user def id column In
  • java.lang.OutOfMemoryError:Scala 上超出了 GC 开销限制

    我是 Scala 开发人员 我在Routes它包含的文件1008行如果我添加另一行 则会抛出下面的错误 Uncaught error from thread sbt web scheduler 1 shutting down JVM sin
  • 如何将句子拆分为多个空格分隔的单词?

    下面的代码 val sentence 1 2 3 4 split 给我 Array 1 2 3 4 但我只想说 Array 1 2 3 4 当单词之间有多个空格分隔时 如何分割句子 使用正则表达式 scala gt 1 2 3 split
  • 为什么 Scala 选项的 foreach 比 get 更好?

    为什么使用foreach map flatMap等被认为比使用更好get对于 Scala 选项 如果我使用isEmpty我可以打电话get安全 好吧 这又回到了 告诉 不要问 考虑这两行 if opt isDefined println o
  • 理解无形状的“单态”示例

    The 无形特征概述 https github com milessabin shapeless wiki Feature overview 3a shapeless 2 0 0显示以下示例 import poly choose is a
  • 如何在 Scala 中将 DataFrame 模式写入文件

    我有一个 DataFrame 它从一个巨大的 json 文件加载并从中获取架构 该架构基本上大约有 1000 列 我希望将 printSchema 的相同输出保存在文件中而不是控制台中 有任何想法吗 如果您在本地环境中工作 您可以执行以下操
  • 获取 N 的素数列表

    我正在尝试编写一个函数 它接受一个 Int 并返回直到并包括该 Int 的所有素数 例如 8 的素数列表 List 3 5 7 这是我到目前为止所拥有的 def isPrime i Int Boolean if i lt 1 false e
  • K均值||用于 Spark 上的情感分析

    我正在尝试编写基于Spark的情感分析程序 为此 我使用了 word2vec 和 KMeans 聚类 从 word2Vec 我在 100 维空间中得到了 20k 个单词 向量集合 现在我正在尝试对这个向量空间进行聚类 当我使用默认并行实现运
  • 使用 Akka 将文件从服务器流式传输到客户端

    基本上我想允许用户从服务器下载 csv 文件 假设服务器上已存在 CSV 文件 API 端点通过 GET export 公开 如何将文件从 Akka HTTP 服务器流式传输到客户端 这就是我到目前为止所拥有的 Service def ex
  • Scala“对象”的继承

    我有这个Java代码 class Super public static void foo bar public static void bar out println BAR public static void main String
  • 如何将枚举绑定到 playframework 表单?

    我有一个以下形式的枚举 object MatchFilterType extends Enumeration type MatchFilterType Value val gt Value gt val lt Value lt val eq
  • 测试期权价值的更好方法?

    我经常发现自己Option T 对于某些类型T并希望根据某个值来测试期权的价值 例如 val opt Some oxbow if opt isDefined opt get lakes do something 以下代码是等效的 并且不需要
  • 作为单例集合的选项 - 现实生活中的用例

    标题几乎概括了这一点 Option作为单例集合有时会令人困惑 但有时它允许一个有趣的应用程序 我脑子里有一个例子 并且想了解更多这样的例子 我唯一的例子是运行for对的理解Option List T 我们可以执行以下操作 val v Som
  • 我可以使用从 Java 实现 java 接口的 scala 类吗?

    我正在学习 Scala 很好奇是否可以 创建一个在 Scala 中实现 Java 接口的对象 将对象编译成类文件并将其打包 使用 Java 中的对象 我想在 scala 中实现一个自定义的 lucene 查询解析器 并能够让其他人从 jav
  • 错误:使用替代方法写入重载方法值:

    我正在尝试读取固定宽度的文件并将其写入文本文件 下面是代码 输入文件布局字段的长度 4 10 3 5 3 1 1 5 7 094482018 07 10 022 14012 000 0 30000A 002290 059412018 07
  • 通过Listener获取Spark thrift服务器查询中读取的行数

    我正在尝试为我们的 ST 服务器构建一个监控系统 到目前为止 诸如记录查询 检索的行 红色和花费的时间之类的事情都很好 我已经实现了一个自定义侦听器 我能够毫无问题地检索查询和时间 侦听SparkListenerSQLExecutionSt
  • Scala Spark:将数据框中的双列转换为日期时间列

    我正在尝试编写代码来将日期时间列 date 和 last updated date 转换为 mm dd yyyy 格式以进行显示 它们实际上是 unix 时间转换为双精度数 我该怎么做呢 import org joda time impor
  • 特征/类类型参数优先于方法类型参数的规则是什么

    我已经使用 scala 一段时间了 我认为我真的开始理解一切 好吧 大多数事情 但我发现自己对 Map 类中的许多方法定义感到困惑 我知道 FoldLeft 等如何工作 但我感到困惑的是 Map 函数中使用的类型参数 我们以 FoldLef
  • 首次使用 SBT - 检索代理背后的依赖项时出现问题

    我已经下载了 SBT sbt 0 13 15 zip 并将其解压缩 但在运行 sbt bat 时遇到问题 最初 我遇到了代理问题 当我发现需要指定时修复了这些问题onlyhttpsconfig 而不是 http 的 当提供两者时 它使用的是
  • 使用新的反射API,如何找到类的主构造函数?

    您可以像这样获取类的所有构造函数 import scala reflect runtime universe val ctor typeOf SomeClass declaration nme CONSTRUCTOR asTerm alte

随机推荐