Tôi đang sử dụng scalap
để đọc tên trường của một số trường hợp (như được thảo luận trong this question). Cả hai trường hợp các lớp và mã sử dụng scalap
để phân tích chúng đã được biên dịch và đưa vào một tệp jar trên đường dẫn lớp.Có thể sử dụng scalap từ tập lệnh scala không?
Bây giờ tôi muốn chạy một kịch bản có sử dụng mã này, vì vậy tôi tiếp the instructions và đã đưa ra một cái gì đó giống như
::#!
@echo off
call scala -classpath *;./libs/* %0 %*
goto :eof
::!#
//Code relying on pre-compiled code that uses scalap
mà không làm việc:
java.lang.ClassCastException: scala.None $ không thể được đúc để scala.Option tại scala.tools.nsc.interpreter.ByteCode $ .caseParamNamesForPath (bytecode scala:. 45) tại scala.tools.nsc.interpreter.ProductCompletion.caseNames (ProductComple 01.235.tion.scala: 22)
Tuy nhiên, mã hoạt động tốt khi tôi biên dịch mọi thứ. Tôi đã chơi xung quanh với các tùy chọn scala
bổ sung như -savecompiled
, nhưng điều này không giúp ích gì. Đây có phải là một lỗi, hoặc không thể làm việc này về nguyên tắc? (Nếu có, ai đó có thể giải thích tại sao không? Như tôi đã nói, các trường hợp sẽ được phân tích bởi scalap
được biên soạn.)
Lưu ý: Tôi sử dụng Scala 2.9.1-1.
EDIT
Dưới đây là những gì tôi đang chủ yếu cố gắng làm (cung cấp một cách đơn giản để tạo ra nhiều trường hợp của một lớp học trường hợp):
//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(...)
Lưu ý: Tôi chuyển sang Scala 2.9.2, lỗi vẫn giữ nguyên (vì vậy có thể không phải là lỗi).
Bạn có thể cung cấp thêm một chút mã của mình không? – Edmondo1984
@ Edmondo1984: chắc chắn, xem ở trên. –
Có vẻ như tôi cần thêm thông tin. Nếu tôi lấy ra các tham số từ createSeq và trả về Seq.empty [T] tôi không thể có được một sự sụp đổ của trình biên dịch ... – Edmondo1984