2012-09-11 3 views
1

Je joue avec la réflexion dans Scala 2.10.0-M7 et trébuché sur la méthode ClassSymbol.isCaseClass qui se comporte comme prévu dans la console scala mais pas quand exécuté en tant qu'application java ou en tant que script scala.Scala 2.10 réflexion: ClassSymbol.isCaseClass fonctionne dans la console scala mais pas dans le script/application

J'ai défini TestScript.scala comme ceci:

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

Si je l'exécute sur la ligne de commande appelant

$ scala TestScript.scala 

Je reçois cette sortie:

isCaseClass: false 

Si je place entrez le code dans le shell de scala interactif ou chargez-le comme ceci:

scala> :load TestScript.scala 

-je obtenir la sortie correcte suivante:

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

Si je le compiler et l'exécuter comme une application Java standard que je reçois false comme résultat pour ClassSymbol.isCase à nouveau.

Qu'est-ce qui me manque? Quelles sont les différences entre l'environnement de la console scala et l'environnement d'exécution java? Comment puis-je obtenir le bon résultat dans une application réelle?

Répondre

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

Edit: pour répondre à votre dernière question, vous ne comptez pas utiliser une étape importante dans une application réelle. :)

Mise à jour. Correction depuis Scala 2.10.0-RC1.

+0

Cela fonctionne si elle est exécutée en tant qu'application java, mais étonnamment pas si elle est exécutée en tant que script scala. Mais comme le script était seulement pour essayer, ce n'est pas un bloqueur pour moi. En ce qui concerne votre montage: bien sûr, je n'utilise pas de jalon pour une application productive ;-) Avec "real", je voulais seulement dire qu'un artefact compilé (par exemple jar) fonctionnait sur la JVM. – sven

Questions connexes