为何Scala REPL中定义的函数显示为Lambda而非<function01>?
Scala REPL显示Lambda实例而非
<function01>的原因 版本与JVM目标的差异:Scala 2.12及以后版本默认适配JVM 8+,使用JVM原生Lambda(基于
invokedynamic指令)实现匿名函数。此时REPL显示的是JVM Lambda实例的运行时标识,比如Lambda$xxx@xxxx。而Scala 2.11及更早版本会将匿名函数编译为Scala自带的FunctionN类实例,REPL会输出<function01>这类格式化标识。REPL toString逻辑变化:新版本Scala REPL直接输出JVM Lambda实例的默认
toString结果,旧版本则调用ScalaFunction类的自定义toString方法,生成<functionN>格式的字符串。验证方法:
- 切换到Scala 2.11或更早版本的REPL,重新定义函数即可看到
<function01>输出。 - 在新版Scala中,通过编译选项
-target:jvm-1.7强制使用旧的函数实现,REPL也会恢复<functionN>的显示。
- 切换到Scala 2.11或更早版本的REPL,重新定义函数即可看到
内容的提问来源于stack exchange,提问作者Catarina Nogueira
相关产品推荐
相关产品推荐

