2012-04-25 11 views
6

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

+0

mógłbyś podać trochę więcej kodu? – Edmondo1984

+0

@ Edmondo1984: jasne, patrz wyżej. –

+0

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

Odpowiedz

0

Jest to błąd w kompilatorze:

  • Jeśli uruchomić program wewnątrz IDE, na przykład IntelliJ IDEA kod wykonywany jest w porządku, jednak nie ma pola nazwy zostały znalezione.
  • Jeśli uruchomisz go z wiersza poleceń za pomocą scala, otrzymasz błąd, o którym wspomniałeś.

Nie ma sposobu, aby bezpieczny typ mógł kiedykolwiek kompilować i rzucić wyjątek ClassCastException.

Proszę otworzyć błąd w https://issues.scala-lang.org/secure/Dashboard.jspa