Scala 2.10反射:ClassSymbol.isCaseClass在scala控制台中工作,但不在脚本/ app中工作

时间:2012-09-11 20:02:06

标签: scala reflection scala-2.10

我正在使用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运行时环境之间有什么区别?如何在实际应用中获得正确的结果?

1 个答案:

答案 0 :(得分:2)

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")

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

UPD。自Scala 2.10.0-RC1起修复。