Używam scalap
do odczytywania nazw pól niektórych klas przypadków (jak omówiono w this question). Zarówno klasy przypadków, jak i kod używający do analizy scalap
zostały skompilowane i umieszczone w pliku jar w ścieżce klas.Czy można używać skalapu ze skryptu scala?
Teraz chcę uruchomić skrypt, który używa tego kodu, więc po the instructions i wymyślił coś takiego
::#!
@echo off
call scala -classpath *;./libs/* %0 %*
goto :eof
::!#
//Code relying on pre-compiled code that uses scalap
który nie działa:
java.lang.ClassCastException: scala.None $ nie może być przesłane do scala.Option w scala.tools.nsc.interpreter.ByteCode $ .caseParamNamesForPath (ByteCode. scala: 45) w scala.tools.nsc.interpreter.ProductCompletion.caseNames (ProductComple tion.scala: 22)
Jednak kod działa dobrze, gdy kompiluję wszystko. Grałem z dodatkowymi opcjami scala
, takimi jak -savecompiled
, ale to nie pomogło. Czy to błąd, czy nie może to w zasadzie działać? (Jeśli tak, to czy ktoś może wyjaśnić dlaczego nie? Jak już powiedziałem, kompilowane są klasy przypadków, które będą analizowane przez scalap
.)
Uwaga: Używam Scala 2.9.1-1.
EDIT
Oto co ja zasadniczo stara się zrobić (pod warunkiem, prosty sposób na tworzenie wielu instancji klasy obudowy):
//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(...)
Uwaga: I przeniósł się do Scala 2.9.2, błąd pozostaje taki sam (więc prawdopodobnie nie jest to błąd).
mógłbyś podać trochę więcej kodu? – Edmondo1984
@ Edmondo1984: jasne, patrz wyżej. –
Wygląda na to, że potrzebuję więcej informacji. Jeśli zdejmę parametry z createSeq i zwrócę Seq.empty [T], nie mogę uzyskać awarii kompilatora ... – Edmondo1984