【问题标题】:Scala 2.10 reflection: ClassSymbol.isCaseClass works in scala console but not in script/appScala 2.10 反射:ClassSymbol.isCaseClass 在 scala 控制台中有效,但在脚本/应用程序中无效
【发布时间】:2012-09-11 20:02:06
【问题描述】:

我在 Scala 2.10.0-M7 中使用反射,偶然发现了 ClassSymbol.isCaseClass 方法,该方法在 scala 控制台中的行为与预期的一样,但在作为 java 应用程序或作为 scala 脚本执行时却不是。

我这样定义TestScript.scala

import reflect.runtime.currentMirror

case class TestCase(foo: String)

object Test {
  def main(args: Array[String]) {
    val classSymbol = currentMirror.reflect(new TestCase("foo")).symbol
    val isCaseClass = classSymbol.isCaseClass
    println(s"isCaseClass: $isCaseClass")
  }
}

Test.main(Array())

如果我在命令行调用中执行它

$ scala TestScript.scala

我得到这个输出:

isCaseClass: false

如果我将代码输入到交互式 scala shell 中或像这样加载它:

scala> :load TestScript.scala

我得到以下正确的输出:

Loading TestScript.scala...
import reflect.runtime.currentMirror
defined class TestCase
defined module Test
isCaseClass: true

如果我编译它并将其作为标准 Java 应用程序执行,我会再次得到 false 作为 ClassSymbol.isCase 的结果。

我错过了什么? scala控制台环境和java运行时环境有什么区别?如何在实际应用中得到正确的结果?

【问题讨论】:

    标签: scala reflection scala-2.10


    【解决方案1】:

    https://issues.scala-lang.org/browse/SI-6277

    val classSymbol = cm.reflect(new TestCase("foo")).symbol
    
    { classSymbol.typeSignature }
    val isCaseClass = classSymbol.isCaseClass
    println(s"isCaseClass: $isCaseClass")
    

    编辑:要回答您的最后一个问题,您不会在实际应用程序中使用里程碑。 :)

    更新。自 Scala 2.10.0-RC1 起已修复。

    【讨论】:

    • 如果作为 java 应用程序执行,它可以工作,但如果作为 scala 脚本执行,令人惊讶的是不会。但由于该脚本仅用于尝试,这对我来说没有障碍。关于您的编辑:当然,我不会将里程碑用于生产应用程序;-) 对于“真实”,我仅指在 JVM 上运行的已编译工件(例如 jar)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-21
    • 2018-09-08
    • 2015-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多