【问题标题】:Using Scala Toolbox eval, how do I define I value I can use in later evals?使用 Scala Toolbox eval,我如何定义我可以在以后的 eval 中使用的值?
【发布时间】:2018-06-17 16:04:54
【问题描述】:

我正在使用 Scala 工具箱为 Web 解释器评估一些 Scala 代码。运行良好,代码如下:

import scala.reflect.runtime.universe._
import scala.tools.reflect.ToolBox

object Eval {
  val toolbox = runtimeMirror(getClass.getClassLoader).mkToolBox()

  def eval[T](code: String): T = {
    toolbox.eval(toolbox.parse(code)).asInstanceOf[T]
  }
}

我可以这样做:

Eval.eval[Long]("1 + 1")

并返回2。当我想定义一些东西时,问题就出现了:

Eval.eval[Unit]("val yellow = 5")
Eval.eval[Long]("yellow")

我收到not found: value yellow 错误。如何定义可以在以后使用 Scala Toolbox 进行评估的值?

【问题讨论】:

    标签: scala eval


    【解决方案1】:

    对于持久化环境,您可以直接使用 Scala 的 REPL。请参阅2.11 release notes 最底部的 JSR-223 说明。

    import javax.script.ScriptEngineManager
    
    class DummyClass
    
    object Evaluator {
      val engine = new ScriptEngineManager().getEngineByName("scala")
      val settings = engine.asInstanceOf[scala.tools.nsc.interpreter.IMain].settings
      settings.embeddedDefaults[DummyClass]
      engine.eval("val x: Int = 5")
      val thing = engine.eval("x + 9").asInstanceOf[Int]
    }
    

    DummyClass(或实际上任何可以替代DummyClass 的课程)的需求源于due to SBT and classloader concerns 的一些恶作剧(更多细节here)。

    【讨论】:

    • 啊,这太棒了!现在唯一的问题是如果脚本中有错误,我如何获取引擎内部发生的异常?现在它只返回一个 ScriptException 并且.getMessage() 返回javax.script.ScriptException: compile-time error,即使实际原因已打印到终端?
    猜你喜欢
    • 2021-10-20
    • 1970-01-01
    • 1970-01-01
    • 2021-01-08
    • 1970-01-01
    • 1970-01-01
    • 2015-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多