Отражение Scala 2.10: ClassSymbol.isCaseClass работает в консоли Scala, но не в скрипте/приложении

Я играю с отражением в 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 или загружу его следующим образом:

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? Как я могу получить правильный результат в реальном приложении?


person sven    schedule 11.09.2012    source источник


Ответы (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.

person som-snytt    schedule 11.09.2012
comment
Он работает, если выполняется как java-приложение, но, что удивительно, не работает, если выполняется как сценарий Scala. Но поскольку сценарий предназначен только для проб, для меня это не блокировщик. Что касается вашего редактирования: конечно, я не использую веху для продуктивного приложения ;-) Под реальным я имел в виду только скомпилированный артефакт (например, jar), работающий на JVM. - person sven; 12.09.2012