Estoy usando scalap
para leer los nombres de campo de algunas clases de casos (como se explica en this question). Tanto las clases de casos como el código que usa scalap
para analizarlos se han compilado y puesto en un archivo jar en classpath.¿Es posible usar scalap desde un script scala?
Ahora quiero ejecutar un script que utiliza este código, por lo que siguió the instructions y se acercó con algo así como
::#!
@echo off
call scala -classpath *;./libs/* %0 %*
goto :eof
::!#
//Code relying on pre-compiled code that uses scalap
que no funciona:
java.lang.ClassCastException: scala.None $ no se puede convertir a scala.Option en scala.tools.nsc.interpreter.ByteCode $ .caseParamNamesForPath (ByteCode. scala: 45) en scala.tools.nsc.interpreter.ProductCompletion.caseNames (ProductComple tion.scala: 22)
Sin embargo, el código funciona bien cuando compilo todo. Jugué con opciones adicionales scala
como -savecompiled
, pero esto no ayudó. ¿Es esto un error, o no puede funcionar esto en principio? (Si es así, ¿podría alguien explicar por qué? Como ya he dicho, se compilan las clases de casos que se analizarán por scalap
)
Nota: utilizo Scala 2.9.1-1.
EDITAR
Aquí es lo que estoy esencialmente tratando de hacer (que proporciona una forma sencilla de crear múltiples instancias de una clase de casos):
//This is pre-compiled:
import scala.tools.nsc.interpreter.ProductCompletion
//...
trait MyFactoryTrait[T <: MyFactoryTrait[T] with Product] {
this: T =>
private[this] val copyMethod = this.getClass.getMethods.find(x => x.getName == "copy").get
lazy val productCompletion = new ProductCompletion(this)
/** The names of all specified fields. */
lazy val fieldNames = productCompletion.caseNames //<- provokes the exception (see above)
def createSeq(...):Seq[T] = {
val x = fieldNames map { ... } // <- this method uses the fieldNames value
//[...] invoke copyMethod to create instances
}
// ...
}
//This is pre-compiled too:
case class MyCaseClass(x: Int = 0, y: Int = 0) extends MyFactoryTrait[MyCaseClass]
//This should be interpreted (but crashes):
val seq = MyCaseClass().createSeq(...)
Nota: pasé a Scala 2.9.2, el error permanece igual (por lo que probablemente no sea un error).
¿Podría dar un poco más de su código? – Edmondo1984
@ Edmondo1984: seguro, mira arriba. –
Parece que necesito más información. Si elimino los parámetros de createSeq y devuelvo Seq.empty [T], no puedo obtener un bloqueo del compilador ... – Edmondo1984