【问题标题】:Is it possible to use scalap from a scala script?是否可以从 scala 脚本中使用 scalap?
【发布时间】:2012-04-25 08:40:16
【问题描述】:

我正在使用scalap 读出一些案例类的字段名称(如this question 中所述)。案例类和使用scalap 分析它们的代码都已编译并放入类路径上的jar 文件中。

现在我想运行一个使用此代码的脚本,所以我关注the instructions 并想出了类似的东西

::#!
@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。

编辑

这就是我真正想做的事情(提供一种创建案例类的多个实例的简单方法):

//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,错误保持不变(所以可能不是错误)。

【问题讨论】:

  • 你能提供更多的代码吗?
  • @Edmondo1984:当然,见上文。
  • 看来我需要更多信息。如果我从 createSeq 中取出参数并返回 Seq.empty[T] 我无法获得编译器崩溃...
  • 如果你返回一个空序列并且不依赖 fieldNames (这是一个 lazy val),这确实应该没问题。导致崩溃的原因是productCompletion.caseNames(参见示例代码中的 cmets)。感谢您的尝试;我会稍微澄清一下示例代码。

标签: scala reflection case-class scalap


【解决方案1】:

这是编译器中的一个错误:

  • 如果您在 ide 中运行程序,例如 Intellij IDEA,代码可以正常执行,但找不到字段名称。
  • 如果您使用 scala 从命令行运行它,则会收到您提到的错误。

类型安全不可能编译并抛出运行时 ClassCastException。

请在https://issues.scala-lang.org/secure/Dashboard.jspa打开一个错误

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-15
    • 2011-11-03
    • 2014-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-22
    • 1970-01-01
    相关资源
    最近更新 更多