2.11中的Scala脚本

时间:2015-03-31 16:23:07

标签: scala reflection scripting compilation

我在回答Generating a class from string and instantiating it in Scala 2.10时找到了Scala运行时脚本的示例代码,但是代码似乎已经过时了2.11 - 我找不到与build.setTypeSignature对应的任何函数。即使它有效,代码似乎很难阅读并跟随我。

如何在Scala 2.11中编译和执行Scala脚本?

让我们假设我想要关注:

  • 定义几个变量(名称和值)
  • 编译脚本
  • (可选改进)更改变量值
  • 执行脚本

为简单起见,请考虑以下示例:

我想定义以下变量(以编程方式,从代码中,而不是从脚本文本中):

val a = 1
val s = "String"

我希望编译以下脚本,并在执行时从其返回String"a is 1, s is String"

s"a is $a, s is $s"

我的功能应该如何?

def setupVariables() = ???

def compile() = ???

def changeVariables() = ???

def execute() : String = ???

1 个答案:

答案 0 :(得分:2)

Scala 2.11 adds a JSR-223 scripting engine。它应该为您提供您正在寻找的功能。提醒一下,与所有这些动态事物一样,包括上面描述中列出的示例,您将失去类型安全性。您可以在下面看到返回类型始终为Object。

Scala REPL示例:

scala> import javax.script.ScriptEngineManager

import javax.script.ScriptEngineManager


scala> val e = new ScriptEngineManager().getEngineByName("scala")

e: javax.script.ScriptEngine = scala.tools.nsc.interpreter.IMain@566776ad


scala> e.put("a", 1)

a: Object = 1


scala> e.put("s", "String")

s: Object = String


scala> e.eval("""s"a is $a, s is $s"""")

res6: Object = a is 1, s is String`

作为在scala 2.11.6下运行的应用程序的附加示例:

import javax.script.ScriptEngineManager

object EvalTest{
  def main(args: Array[String]){
   val e = new ScriptEngineManager().getEngineByName("scala")
   e.put("a", 1)
   e.put("s", "String")
   println(e.eval("""s"a is $a, s is $s""""))
  }
}

要使此应用程序正常工作,请确保包含库依赖项。

libraryDependencies +=  "org.scala-lang" % "scala-compiler" % scalaVersion.value