Я использую scalap
для считывания имен полей некоторых классов case (, как обсуждалось в . этот вопрос). И классы case, и код, который использует scalap
для их анализа, были скомпилированы и помещены в jar-файл в пути к классам.
Теперь я хочу запустить скрипт, который использует этот код, поэтому я следовал инструкциям и придумал нечто вроде
::#!
@echo off
call scala -classpath *;./libs/* %0 %*
goto :eof
::!#
//Code relying on pre-compiled code that uses scalap
, которое не работает:
java.lang.ClassCastException :scala.None$ нельзя преобразовать в scala.Option в scala.tools.nsc.interpreter.ByteCode$.caseParamNamesForPath (ByteCode. скала :45 )в scala.tools.nsc.interpreter.ProductCompletion.caseNames (ProductComple tion.scala :22)
Однако, когда я все компилирую, код работает нормально. Я поигрался с дополнительными опциями scala
вроде -savecompiled
, но это не помогло. Это баг, или это не может работать в принципе? (Если да, то может ли кто-нибудь объяснить, почему нет? Как я уже сказал, классы случаев, которые должны быть проанализированы в scalap
, компилируются.)
Примечание :Я использую Scala 2.9.1 -1.
РЕДАКТИРОВАТЬ
Вот что я по существу пытаюсь сделать (предоставляя простой способ создания нескольких экземпляров класса case):
//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(...)
Примечание :Я перешел на Scala 2.9.2, ошибка остается прежней (, так что, вероятно, это не ошибка ).