2012-04-25 31 views
6

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

+0

Bạn có thể cung cấp thêm một chút mã của mình không? – Edmondo1984

+0

@ Edmondo1984: chắc chắn, xem ở trên. –

+0

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

Trả lời

0

Đây là một lỗi trong trình biên dịch:

  • Nếu bạn chạy chương trình bên trong một ide, ví dụ Intellij IDEA mã được thực hiện tốt, tuy nhiên không có trường tên được tìm thấy.
  • Nếu bạn chạy nó từ dòng lệnh bằng cách sử dụng scala, bạn có được lỗi mà bạn đã đề cập.

Không có cách nào an toàn loại có thể bao giờ nên biên dịch và ném một ClassCastException thời gian chạy.

Vui lòng mở một lỗi tại https://issues.scala-lang.org/secure/Dashboard.jspa

Các vấn đề liên quan