斯卡拉2.10反思:ClassSymbol.isCaseClass工作在斯卡拉控制台,但不是在脚本/

2019-10-17 05:42发布

我玩弄反射在斯卡拉2.10.0-M7和偶然发现了ClassSymbol.isCaseClass其如期望的那样在斯卡拉控制台,但不是在一个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> :load TestScript.scala

我得到以下正确的输出:

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

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

我在想什么? 什么是Scala的控制台环境和Java运行时环境之间的差异? 我怎样才能得到正确的结果在实际的应用?

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

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

UPD。 因为斯卡拉2.10.0-RC1固定。



文章来源: Scala 2.10 reflection: ClassSymbol.isCaseClass works in scala console but not in script/app